【问题标题】:Microsoft-Graph refresh-token request fails... AADSTS70000Microsoft-Graph 刷新令牌请求失败... AADSTS70000
【发布时间】:2017-10-16 17:51:18
【问题描述】:

我在使用 Microsoft Graph 的 Slim3 WebApp 中使用带有 guzzle 的联盟/oauth 客户端...我无法通过给定的刷新令牌成功请求新令牌...

这是我的联盟/oauth-client 容器:

$container['oauthprovider'] = function ()
{
  $provider = new \League\OAuth2\Client\Provider\GenericProvider(
    [
      'clientId' => getenv('ENV_CLIENT_ID'),
      'clientSecret' => getenv('ENV_CLIENT_SECRET'),
      'redirectUri' => getenv('ENV_REDIRECT_URL'),
      'urlAuthorize' => getenv('ENV_AUTHORIZE_URL'),
      'urlAccessToken' => getenv('ENV_URL_ACCESS_TOKEN'),
      'urlResourceOwnerDetails' => '',
      'scopes' => 'offline_access user.read people.read user.read.all openid mail.send'
    ]
  );
  return $provider;
};

工作正常 - 在重定向后的 Slim3-Route 中,我得到了所有令牌、refresh_token 等。

$provider = $this -> oauthprovider;
$CODE = filter_var($_GET['code'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$accessToken = $provider -> getAccessToken('authorization_code',
    ['code' => $CODE]
);

...

$existingAccessToken = $accessToken -> getToken();
$refreshToken = $accessToken -> getRefreshToken();
$expiresIn = $accessToken -> getExpires();
$expired = ($accessToken -> hasExpired() ? true : false);
$client = $this -> guzzzle;

...

如果我此时尝试刷新我的令牌 - 在同一个 Slim3 路由中 - 它工作正常:

$newAccessToken = $provider -> getAccessToken('refresh_token', [
    'refresh_token' => $accessToken -> getRefreshToken(),
    'grant_type' => 'refresh_token'
]);

但这不是我的目标 - 我必须在另一个 Slim3-Route 中达到过期的生命周期 - 1 小时来刷新令牌:

$accessToken =  unserialize($session -> get('serialized_token'));
$refreshToken = unserialize($session -> get('serialized_refresh_token'));
$code = $session -> get('code');
$provider = $this -> oauthprovider;
$client = $this -> guzzzle;

...

$req = $client -> request('POST', 
    'https://login.windows.net/common/oauth2/token', [
    'form_params' => [
    'accept' => 'application/json',
    'grant_type'=> 'refresh_token',
    'client_id' => getenv('ENV_CLIENT_ID'),
    'client_secret' => getenv('ENV_CLIENT_SECRET'),
    'refresh_token' => (string) $refreshToken,
    'redirect_uri' => getenv('ENV_REDIRECT_URL')
  ]
]);

回应:

客户端错误:POST https://login.windows.net/common/oauth2/token 导致 400 Bad Request 响应:{"error":"invalid_grant","error_description":"AADSTS70000:传输数据解析器失败:刷新令牌格式错误(截断...)

刷新令牌与我在初始请求中得到的完全一样。

任何有 oauth-client/guzzle/Microsoft Graph 经验的人 - 我的错误是什么/在哪里?

【问题讨论】:

  • 请不要使用脏话。

标签: oauth-2.0 microsoft-graph-api guzzle slim-3 refresh-token


【解决方案1】:

由于您使用的是 v2 Endpoint,因此您的 POST 应该是 https://login.microsoftonline.com/common/oauth2/v2.0/token 并且您的有效负载应该包含 scope 属性:

$req = $client -> request('POST', 
   'https://login.microsoftonline.com/common/oauth2/v2.0/token', [
    'form_params' => [
        'grant_type'=> 'refresh_token',
        'client_id' => getenv('ENV_CLIENT_ID'),
        'client_secret' => getenv('ENV_CLIENT_SECRET'),
        'refresh_token' => (string) $refreshToken,
        'redirect_uri' => getenv('ENV_REDIRECT_URL'),
        'scope' => 'offline_access user.read people.read user.read.all openid mail.send'
    ]
]);

【讨论】:

  • 是的 - 我这样做了,马克。我请求login.microsoftonline.com/common/oauth2/v2.0/token 端点。我对访问令牌的初始请求工作正常。
  • 问题是在第一个访问令牌过期后,在不同的 Slim3-Route 中使用我的初始刷新令牌获取新的访问令牌。不知道问题是league/oauth-clientSlim-DI-Container,还是别的什么...?
  • Thanx Marc,我对 https://login.microsoftonline.com/common/oauth2/v2.0/token 的请求工作正常 - 响应包含一个新令牌和一个新刷新令牌。
【解决方案2】:

例如 - 如果我向我的联盟/oauth-Client 请求 Microsoft-Graph 并通过以下方式狂饮:

      $request = $client -> request('GET', "https://login.microsoftonline.com/common/oauth2/v2.0/token", [
        'form_params' => [
          'accept' => 'application/json',
          'grant_type'=> 'refresh_token',
          'client_id' => getenv('ENV_CLIENT_ID'),
          'client_secret' => getenv('ENV_CLIENT_SECRET'),
          'refresh_token' => (string) $refreshToken,
          'redirect_uri' => getenv('ENV_REDIRECT_URL')
        ]
      ]);

      $response = json_decode($request -> getBody() -> getContents(), true);

      echo 'Response: ';
      var_dump($response);
      exit;

响应包含以下信息:

Response: array(7) {
  ["token_type"]=>
  string(6) "Bearer"
  ["scope"]=>
  string(45) "Mail.Send People.Read User.Read User.Read.All"
  ["expires_in"]=>
  int(3599)
  ["ext_expires_in"]=>
  int(0)
  ["access_token"]=>
  string(1901) "...f8SQPrPFsg66q8vHLGM4Q..."
  ["refresh_token"]=>
  string(847) "...cEksGS9XfHIqTH2LUYL..."
  ["id_token"]=>
  string(928) "...KKWAUtlyS0p5rDWILr..."
}

有了这些信息,我可以更新我的应用程序令牌和刷新令牌并继续请求 Microsoft-Graph 端点。

谢谢你,马克!太好了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多