Instagram API 基本显示:请求 access_token 时出现问题 [英] Instagram API Basic Display: Problem with requesting access_token
问题描述
我正在关注
我做错了什么?大家有遇到过类似的问题吗?
我通过像这样使用 GuzzleHttp\Client 设法让我的工作正常工作.
步骤 1.获取授权码 $code
第 2 步.获取短期访问令牌
短期访问令牌的有效期仅为 1 小时.
$aAccessToken = $this->fetchAccessToken( $code );$short_lived_access_token = $aAccessToken['access_token'];$user_id = $aAccessToken['user_id'];
步骤 3(可选)
如果您想要有效期为 60 天的 Long-Lived 令牌,您可以立即兑换 $short_lived_access_token.
$aLongLivedTokenResult == $this->GetLongLivedToken( $short_lived_access_token );$long_lived_access_token = $aLongLivedTokenResult['access_token'];$expires_in = $aLongLivedTokenResult['expires_in'];
long_lived_access_token 和 expires_in 可以保存,当令牌在 60 天后过期时,您可以刷新它.
第 4 步现在您可以像这样获取用户媒体.
请记住 long_lived_access_token 会过期,在您 FETCH 之前,您应该实际检查令牌是否已过期,如果已过期,请交换它以获得新的.然后令牌回收开始.
$aQueryString = ['字段' =>'id,media_url,permalink,timestamp,caption','access_token' =>$long_lived_access_token,];$uri = 'https://graph.instagram.com/{$user_id}/media?'.http_build_query( $aQueryString ) );
//函数
因为 fetchAccessToken 函数使用 POST 方法,所以单独在标头上添加 content-type = application/x-www-form-urlencoded 并没有真正起作用.选项中的 form_params 对我有用.
私有函数fetchAccessToken(){$aOptions = ['app_id' =>$this->provider->AppID,'app_secret' =>$this->provider->AppSecret,'grant_type' =>'授权代码','redirect_uri' =>$this->provider->getRedirectUri(),'代码' =>$访问代码,];$client = 新客户端( ['base_uri' =>'https://api.instagram.com','标题' =>['内容类型' =>'应用程序/x-www-form-urlencoded',],]);$response = $client->request('POST', 'oauth/access_token', ['form_params' =>$a选项,]);返回 json_decode( $response->getBody(), true );}私有函数 GetLongLivedToken( $access_token ){$aOptions = ['grant_type' =>'ig_exchange_token','client_secret' =>$this->provider->AppSecret,'access_token' =>$access_token,];$response = 新客户端( ['base_uri' =>'https://graph.instagram.com',] )-> request( 'GET', 'access_token?' . http_build_query( $aOptions ) );$stream = $response->getBody();$contents = $stream->getContents();返回 json_decode( $contents, true );}
I was following Instagram API Basic Display documentation. I've created Facebook App, configured Instagram Basic Display, added Test User, Authenticated the Test User using GET request:
https://api.instagram.com/oauth/authorize
?app_id={app-id}
&redirect_uri={redirect-uri}
&scope=user_profile,user_media
&response_type=code
But when I try to request access_token using POST request from the documentation: I receive ERROR 400 with message "You must provide a client_id". However, documentation says nothing about client_id and Instagram Basic Display doesn't provide client_id.
What am I doing wrong? Has any of you had similar problem?
I managed to get mine working by using GuzzleHttp\Client like this.
Step 1. get the Authorization Code $code
Step 2. Get the short-lived AccessToken
Short-Lived Access tokens are valid for just 1 hour.
$aAccessToken = $this->fetchAccessToken( $code );
$short_lived_access_token = $aAccessToken[ 'access_token' ];
$user_id = $aAccessToken[ 'user_id' ];
Step 3 (optional)
If you want the Long-Lived token, which is valid for 60days, you can immediately exchange the $short_lived_access_token.
$aLongLivedTokenResult = = $this->GetLongLivedToken( $short_lived_access_token );
$long_lived_access_token = $aLongLivedTokenResult[ 'access_token' ];
$expires_in = $aLongLivedTokenResult[ 'expires_in' ];
long_lived_access_token and expires_in can be saved and when the token has expired after 60 days you can refresh it.
Step 4 Now you can fetch the user media like this.
Bear in mind that the long_lived_access_token expires and before you FETCH you should actually check if the token has expired and if it has, exchange it to get a new one. And the token recycling begins.
$aQueryString = [
'fields' => 'id,media_url,permalink,timestamp,caption',
'access_token' => $long_lived_access_token,
];
$uri = 'https://graph.instagram.com/{$user_id}/media?' . http_build_query( $aQueryString ) );
//functions
Because the fetchAccessToken function uses the POST method, Adding content-type = application/x-www-form-urlencoded on the headers alone didn't really work. form_params on the options did the trick for me.
private function fetchAccessToken(){
$aOptions = [
'app_id' => $this->provider->AppID,
'app_secret' => $this->provider->AppSecret,
'grant_type' => 'authorization_code',
'redirect_uri' => $this->provider->getRedirectUri(),
'code' => $accessCode,
];
$client = new Client( [
'base_uri' => 'https://api.instagram.com',
'headers' => [
'content-type' => 'application/x-www-form-urlencoded',
],
] );
$response = $client->request( 'POST', 'oauth/access_token', [
'form_params' => $aOptions,
] );
return json_decode( $response->getBody(), true );
}
private function GetLongLivedToken( $access_token )
{
$aOptions = [
'grant_type' => 'ig_exchange_token',
'client_secret' => $this->provider->AppSecret,
'access_token' => $access_token,
];
$response = new Client( [
'base_uri' => 'https://graph.instagram.com',
] )->request( 'GET', 'access_token?' . http_build_query( $aOptions ) );
$stream = $response->getBody();
$contents = $stream->getContents();
return json_decode( $contents, true );
}
这篇关于Instagram API 基本显示:请求 access_token 时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!