Ошибка запроса токена обновления Microsoft-Graph AADSTS70000

Я использую клиент league / oauth с жужжанием в Slim3 WebApp, работающем с Microsoft Graph ... и я не могу успешно запросить новый токен с помощью данного токена обновления ...

это мой контейнер для league / 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'
]);

Но это не моя цель - мне нужно обновить токен, достигнув истекшего срока жизни - 1 час - в другом Slim3-Route:

$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 - Что / Где моя ошибка?


person Superpupsi    schedule 13.10.2017    source источник
comment
Пожалуйста, воздержитесь от ненормативной лексики.   -  person elixenide    schedule 13.10.2017


Ответы (2)


Поскольку вы используете конечную точку v2, ваш 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'
    ]
]);
person Marc LaFleur    schedule 13.10.2017
comment
Да, я так и делаю, Марк. Я прошу login.microsoftonline.com/common/oauth2/v2.0/token конечная точка. Мой первоначальный запрос на токен доступа работает нормально. - person Superpupsi; 16.10.2017
comment
Проблема состоит в том, чтобы получить новый токен доступа с моим первоначальным токеном обновления в другом Slim3-Route после истечения срока действия первого токена доступа. Я не знаю, проблема в league/oauth-client, Slim-DI-контейнере или в чем-то еще ...? - person Superpupsi; 16.10.2017
comment
Спасибо, Марк, мой запрос к https://login.microsoftonline.com/common/oauth2/v2.0/token работает нормально - ответ содержит новый токен и новый токен обновления. - person Superpupsi; 16.10.2017

Например, если я запрашиваю Microsoft-Graph с моим league / oauth-Client и жру через:

      $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.

Спасибо, Марк! Большой!

person Superpupsi    schedule 16.10.2017