Rumah > Soal Jawab > teks badan
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粉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", ])