Instagram API 基本显示:请求有问题 access_token
Instagram API Basic Display: Problem with requesting access_token
我正在关注 Instagram API Basic Display 文档。我创建了 Facebook 应用程序,配置了 Instagram 基本显示,添加了测试用户,使用 GET 请求对测试用户进行了身份验证:
https://api.instagram.com/oauth/authorize
?app_id={app-id}
&redirect_uri={redirect-uri}
&scope=user_profile,user_media
&response_type=code
但是当我尝试使用文档中的 POST 请求来请求 access_token 时:我收到错误 400 和消息 "You must provide a client_id"。但是,文档没有说明 client_id 并且 Instagram Basic Display 不提供 client_id.
我做错了什么?大家有遇到过类似的问题吗?
我设法通过使用 GuzzleHttp\Client 使我的工作正常。
步骤 1。获取授权码 $code
步骤 2。获取 short-lived AccessToken
Short-Lived 访问令牌的有效期仅为 1 小时。
$aAccessToken = $this->fetchAccessToken( $code );
$short_lived_access_token = $aAccessToken[ 'access_token' ];
$user_id = $aAccessToken[ 'user_id' ];
步骤 3(可选)
如果你想要Long-Lived令牌,有效期为60天,你可以立即兑换$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 = [
'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 ) );
//函数
因为fetchAccessToken函数使用了POST方法,单独在headers上添加content-type = application/x-www-form-urlencoded没有'真的不行。 form_params 选项对我有用。
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 );
}
您应该使用 正文 中的参数向 https://api.instagram.com/oauth/access_token 发出 POST 请求,而不是参数。确保 "x-www-form-urlencoded" 选项已启用。
在此处查看更详细的答案:
我正在关注 Instagram API Basic Display 文档。我创建了 Facebook 应用程序,配置了 Instagram 基本显示,添加了测试用户,使用 GET 请求对测试用户进行了身份验证:
https://api.instagram.com/oauth/authorize
?app_id={app-id}
&redirect_uri={redirect-uri}
&scope=user_profile,user_media
&response_type=code
但是当我尝试使用文档中的 POST 请求来请求 access_token 时:我收到错误 400 和消息 "You must provide a client_id"。但是,文档没有说明 client_id 并且 Instagram Basic Display 不提供 client_id.
我做错了什么?大家有遇到过类似的问题吗?
我设法通过使用 GuzzleHttp\Client 使我的工作正常。
步骤 1。获取授权码 $code
步骤 2。获取 short-lived AccessToken
Short-Lived 访问令牌的有效期仅为 1 小时。
$aAccessToken = $this->fetchAccessToken( $code );
$short_lived_access_token = $aAccessToken[ 'access_token' ];
$user_id = $aAccessToken[ 'user_id' ];
步骤 3(可选)
如果你想要Long-Lived令牌,有效期为60天,你可以立即兑换$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 = [
'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 ) );
//函数
因为fetchAccessToken函数使用了POST方法,单独在headers上添加content-type = application/x-www-form-urlencoded没有'真的不行。 form_params 选项对我有用。
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 );
}
您应该使用 正文 中的参数向 https://api.instagram.com/oauth/access_token 发出 POST 请求,而不是参数。确保 "x-www-form-urlencoded" 选项已启用。
在此处查看更详细的答案: