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?
Ralat ditemui. Dalam skrip ujian, panggilan redirectUri
被傳遞到 OAuth2 客戶端的構造函數(shù)中;在應用程序中,它被傳遞到 getAuthorizationUrl
函數(shù)中。這適用于對 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", ])