Instagram API基本显示:请求access_token的问题

时间:2019-11-28 15:38:35

标签: facebook api instagram access-token instagram-api

我正在关注Instagram API Basic Display文档。我创建了Facebook App,配置了Instagram Basic Display,添加了测试用户,并使用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,消息为“您必须提供client_id”。但是,文档中没有关于client_id的信息,Instagram基本显示不提供client_id。

enter image description here

我在做什么错?你们有没有类似的问题?

2 个答案:

答案 0 :(得分:2)

您应该使用主体中的参数(而不是Params)向https://api.instagram.com/oauth/access_token发出POST请求。确保已启用“ x-www-form-urlencoded”选项。

enter image description here

在此处查看更详细的答案:https://stackoverflow.com/a/60851414/1908112

答案 1 :(得分:1)

我设法通过使用GuzzleHttp \ Client这样使我的工作正常。

步骤1 。获取授权码$ code

第2步。获取短暂的AccessToken

短期访问令牌的有效期仅为1小时。

$aAccessToken = $this->fetchAccessToken( $code );
$short_lived_access_token = $aAccessToken[ 'access_token' ];
$user_id                  = $aAccessToken[ 'user_id' ];

第3步(可选)

如果您需要有效期为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会过期,因此在您抓取之前,您应该实际检查令牌是否已过期,如果已过期,请交换令牌以获取新的令牌。然后令牌回收开始。

    $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 方法,所以仅在标头上添加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 ); 

}