2017-10-13 9 views
0

J'utilise le client league/oauth avec guzzle dans une WebApp Slim3 fonctionnant avec Microsoft Graph ... et je ne peux pas demander un nouveau jeton par un jeton de rafraîchissement donné ...La requête d'actualisation Microsoft-Graph échoue ... AADSTS70000

ceci est mon di-conteneur pour la ligue/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; 
}; 

fonctionne très bien - dans mon Slim3-Route après redirect je suis arrivé, tous les jetons refresh_token, etc.

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

... 

Et si je tente de me rafraîchir jeton à ce moment - dans le même Slim3 route - il fonctionne très bien:

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

Mais ce n'est pas mon objectif - je dois rafraîchir le jeton en atteignant la durée de vie a expiré - 1 heure - dans un autre 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') 
    ] 
]); 

la réponse:

Client error: POST https://login.windows.net/common/oauth2/token resulted in a 400 Bad Request response: {"error":"invalid_grant","error_description":"AADSTS70000: Transmission data parser failure: Refresh Token is malformed (truncated...)

le jeton de rafraîchissement est exactement le même que ce que je suis arrivé dans ma demande initiale.

Toute personne expérimentée avec oauth-client/guzzle/Microsoft Graph - Quoi/Où est mon erreur?

+1

Veuillez ne pas utiliser de blasphème. –

Répondre

1

Puisque vous utilisez la v2 Endpoint, votre POST devrait être de https://login.microsoftonline.com/common/oauth2/v2.0/token et votre charge utile devrait inclure la propriété 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' 
    ] 
]); 
+0

Oui, je le fais, Marc. Je demande le point de terminaison https://login.microsoftonline.com/common/oauth2/v2.0/token. Ma demande initiale pour un access-Token fonctionne bien. – Superpupsi

+0

Le problème est d'obtenir un nouvel access-Token avec mon jeton d'actualisation initial dans un autre Slim3-Route, après l'expiration du premier jeton d'accès. Je ne sais pas si le problème est 'league/oauth-client', le' Slim-DI'-Container, ou autre chose ...? – Superpupsi

+0

Thanx Marc, ma demande de 'https: // login.microsoftonline.com/common/oauth2/v2.0/token' fonctionne bien - la réponse contient un nouveau jeton et un nouveau jeton d'actualisation. – Superpupsi

0

Par exemple - si je demande Microsoft-Graph avec ma ligue/oauth- client et engloutissant via:

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

la réponse contient les informations suivantes:

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..." 
} 

Grâce à ces informations, je peux renouveler le jeton d'application et le jeton d'actualisation et continuer à demander les points de terminaison Microsoft-Graph.

Merci, Marc! Génial!