Oauth 2.0 Microsoft图形刷新令牌请求失败。。。AADSTS70000

Oauth 2.0 Microsoft图形刷新令牌请求失败。。。AADSTS70000,oauth-2.0,microsoft-graph-api,guzzle,slim-3,refresh-token,Oauth 2.0,Microsoft Graph Api,Guzzle,Slim 3,Refresh Token,我正在使用league/oauth客户端和guzzle在Slim3网络应用程序中与Microsoft Graph一起工作。。。我无法通过给定的刷新令牌成功请求新令牌 这是我的league/oauth客户端di容器: $container['oauthprovider']=函数 { $provider=new\League\OAuth2\Client\provider\GenericProvider [ 'clientId'=>getenv'ENV_CLIENT_ID', 'clientSecre

我正在使用league/oauth客户端和guzzle在Slim3网络应用程序中与Microsoft Graph一起工作。。。我无法通过给定的刷新令牌成功请求新令牌

这是我的league/oauth客户端di容器:

$container['oauthprovider']=函数 { $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' ] ; 返回$provider; }; 工作正常-在重定向后的Slim3路线中,我获得了所有令牌、刷新令牌等

$provider=$this->oauthprovider; $CODE=filter\u var$\u GET['CODE'],filter\u SANITIZE\u FULL\u SPECIAL\u CHARS; $accessToken=$provider->getAccessToken‘授权\代码’, ['code'=>$code] ; ... $existingAccessToken=$accessToken->getToken; $refreshToken=$accessToken->getRefreshToken; $expiresIn=$accessToken->getExpires; $expired=$accessToken->hasExpired?真:假; $client=$this->guzzle; ... 如果我尝试在这一点上刷新我的令牌-在相同的Slim3路径中-它工作正常:

$newAccessToken=$provider->getAccessToken'refresh\u token'[ “刷新令牌”=>$accessToken->getRefreshToken, '授权\u类型'=>'刷新\u令牌' ]; 但这不是我的目标-我必须通过另一条Slim3路线达到过期的生命周期(1小时)来刷新令牌:

$accessToken=unserialize$session->get'serialized_token'; $refreshToken=unserialize$session->get'serialized_refresh_token'; $code=$session->get'code'; $provider=$this->oauthprovider; $client=$this->guzzle; ... $req=$client->request'POST', 'https://login.windows.net/common/oauth2/token', [ “表单参数”=>[ '接受'=>'应用程序/json', “授权类型”=>“刷新令牌”, 'client_id'=>getenv'ENV_client_id', 'client_secret'=>getenv'ENV_client_secret', “刷新令牌”=>字符串$refreshToken, 'redirect_uri'=>getenv'ENV_redirect_URL' ] ]; 答复如下:

客户端错误:POSThttps://login.windows.net/common/oauth2/token 导致400个错误的请求响应:{错误:无效的授权,错误描述:AADSTS70000:传输数据解析器失败:刷新令牌格式错误,已截断

刷新令牌与我在初始请求中得到的完全相同


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

既然您使用的是v2端点,您的帖子应该是https://login.microsoftonline.com/common/oauth2/v2.0/token 您的有效负载应包括scope属性:

$req=$client->request'POST', 'https://login.microsoftonline.com/common/oauth2/v2.0/token', [ “表单参数”=>[ “授权类型”=>“刷新令牌”, 'client_id'=>getenv'ENV_client_id', 'client_secret'=>getenv'ENV_client_secret', “刷新令牌”=>字符串$refreshToken, 'redirect_uri'=>getenv'ENV_redirect_URL', 'scope'=>'offline_access user.read people.read user.read.all openid mail.send' ] ];
例如,如果我通过以下方式请求使用我的league/oauth客户端和guzzle的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端点


谢谢你,Marc!太好了!

请不要使用亵渎。是的,我这样做了,Marc。我请求端点。我对访问令牌的初始请求工作正常。问题是在第一个访问令牌过期后,在不同的Slim3路由中使用我的初始刷新令牌获取新的访问令牌。我不知道问题是否为league/oauth客户端、Slim DI容器或其他…?Thanx Marc,我的请求https://login.microsoftonline.com/common/oauth2/v2.0/token 工作正常-响应包含一个新令牌和一个新刷新令牌。