Rumah  >  Soal Jawab  >  teks badan

Ralat OAuth 2.0 Twitter menggesa "Nilai token yang diluluskan adalah tidak sah"

Sunting: Lihat penyelesaiannya. Masalahnya terletak pada cara perpustakaan Twitter diwujudkan.

Saya cuba mendapatkan kebenaran Twitter menggunakan OAuth2. Saya boleh membuatnya berfungsi dalam skrip ujian mudah, tetapi apabila saya cuba menggunakannya dalam pemalam WordPress saya, ia tidak berfungsi.

Saya menggunakan klien OAuth2 PHP League dan perpustakaan yang saya tulis untuk menyambungkannya ke Twitter skrip ujian ada dalam fail readme.

Skrip ujian menyimpan keadaan OAuth2 dalam $_SESSION; aplikasi sebenar menyimpannya dalam WordPress sementara. Saya telah mengesahkan integriti data melalui paip:

Data daripada perpustakaan Twitter selepas menjana URL pengesahan:

Array
(
    [url] => https://twitter.com/i/oauth2/authorize?redirect_uri=https%3A%2F%2Fsmol.blog%2Fwp-json%2Fsmolblog%2Fv2%2Fconnect%2Fcallback%2Ftwitter&code_challenge=EV7BCVYmkvCnIlVLH6cVzrvjNloQlleAkkYwLLgg41w&code_challenge_method=S256&state=fd5824ef415aa325f1f68d3504bb16b3&scope=tweet.read%20users.read%20offline.access&response_type=code&approval_prompt=auto&client_id=MjVXMnRGVUN5Ym5lcVllcTVKZkk6MTpjaQ
    [state] => fd5824ef415aa325f1f68d3504bb16b3
    [verifier] => u7Zbf1gVEFZLyTgr_2Hk~i5P2pt8VgicyhZgdeO0pAyIZqhSoYqglHaIxsNRjHz0AHpwhlU1~Q
)

Data diekstrak daripada WordPress sementara semasa panggil balik (disimpan sedikit berbeza):

Array
(
    [id] => fd5824ef415aa325f1f68d3504bb16b3
    [userId] => 1
    [info] => Array
        (
                [verifier] => u7Zbf1gVEFZLyTgr_2Hk~i5P2pt8VgicyhZgdeO0pAyIZqhSoYqglHaIxsNRjHz0AHpwhlU1~Q
        )

)

Minta objek dari titik akhir token Twitter:

GuzzleHttp\Psr7\Request Object
(
        [method:GuzzleHttp\Psr7\Request:private] => POST
    [requestTarget:GuzzleHttp\Psr7\Request:private] => 
    [uri:GuzzleHttp\Psr7\Request:private] => GuzzleHttp\Psr7\Uri Object
        (
                [scheme:GuzzleHttp\Psr7\Uri:private] => https
            [userInfo:GuzzleHttp\Psr7\Uri:private] => 
            [host:GuzzleHttp\Psr7\Uri:private] => api.twitter.com
            [port:GuzzleHttp\Psr7\Uri:private] => 
            [path:GuzzleHttp\Psr7\Uri:private] => /2/oauth2/token
            [query:GuzzleHttp\Psr7\Uri:private] => 
            [fragment:GuzzleHttp\Psr7\Uri:private] => 
            [composedComponents:GuzzleHttp\Psr7\Uri:private] => 
        )

    [headers:GuzzleHttp\Psr7\Request:private] => Array
        (
                [Host] => Array
                (
                        [0] => api.twitter.com
                )

            [content-type] => Array
                (
                        [0] => application/x-www-form-urlencoded
                )

            [Authorization] => Array
                (
                        [0] => Basic [base64-encoded app id and secret redacted]
                )

        )

    [headerNames:GuzzleHttp\Psr7\Request:private] => Array
        (
                [content-type] => content-type
            [host] => Host
            [authorization] => Authorization
        )

    [protocol:GuzzleHttp\Psr7\Request:private] => 1.1
    [stream:GuzzleHttp\Psr7\Request:private] => GuzzleHttp\Psr7\Stream Object
        (
                [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #101
            [size:GuzzleHttp\Psr7\Stream:private] => 
            [seekable:GuzzleHttp\Psr7\Stream:private] => 1
            [readable:GuzzleHttp\Psr7\Stream:private] => 1
            [writable:GuzzleHttp\Psr7\Stream:private] => 1
            [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
                [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                    (

                )

            )

    )

Teks permintaan di atas:

client_id=MjVXMnRGVUN5Ym5lcVllcTVKZkk6MTpjaQ&client_secret=[redacted]&grant_type=authorization_code&code=aTVUMDkybzdsVmExOEQ5MjdrVjVOQVZ3YTVDbUdmTXRDMktZSzBaSGFqVk5LOjE2NjUzNjc1MjIyNjg6MToxOmFjOjE&code_verifier=u7Zbf1gVEFZLyTgr_2Hk~i5P2pt8VgicyhZgdeO0pAyIZqhSoYqglHaIxsNRjHz0AHpwhlU1~Q

Ralat:

PHP Fatal error:  Uncaught League\OAuth2\Client\Provider\Exception\IdentityProviderException: Value passed for the token was invalid. in /var/www/html/wp-content/plugins/smolblog-wp/vendor/smolblog/oauth2-twitter/src/Twitter.php:169

Saya tahu saya merindui sesuatu yang bodoh di sini. Tetapi saya tidak boleh untuk hidup saya memikirkan apa. Terdapat lebih banyak kod dalam aplikasi sebenar berbanding dalam skrip ujian, tetapi saya telah mengesahkan data pada berbilang titik dalam timbunan, termasuk sebelum menghantarnya ke Twitter. Adakah terdapat apa-apa lagi yang perlu saya uji, atau adakah sesuatu yang saya terlupa?

P粉865900994P粉865900994331 hari yang lalu735

membalas semua(1)saya akan balas

  • P粉155710425

    P粉1557104252023-12-17 00:47:56

    Ralat ditemui. Dalam skrip ujian, panggilan redirectUri 被传递到 OAuth2 客户端的构造函数中;在应用程序中,它被传递到 getAuthorizationUrl 函数中。这适用于对 Twitter 的初始调用,但(显然)getAccessToken juga memerlukan data ini. Jadi inilah penyelesaiannya.

    Lama dan rosak:

    new Twitter([
        'clientId' => $app->env->twitterAppId ?? '',
        'clientSecret' => $app->env->twitterAppSecret ?? '',
    ])
    

    Tempat panas baharu:

    new Twitter([
        'clientId' => $app->env->twitterAppId ?? '',
        'clientSecret' => $app->env->twitterAppSecret ?? '',
        'redirectUri' => "{$app->env->apiBase}connect/callback/twitter",
    ])
    

    balas
    0
  • Batalbalas