2017-10-13 15 views
0

Slim3 WebApp에서 Microsoft Graph ...로 작업하고있는 리그/oauth 클라이언트를 사용 중입니다. 주어진 새로 고침 토큰을 사용하여 새 토큰을 성공적으로 요청할 수 없습니다. ...Microsoft Graph 새로 고침 토큰 요청이 실패 함 ... AADSTS70000

이 리그/OAuth는 클라이언트 내 디 컨테이너 :

$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-경로에서 리디렉션 후 내가 가진 모든 토큰, 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; 

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

을하지만 내 목표는 아니다 - 나는 만료 된 수명에 도달하여 토큰을 새로 고쳐야 할 : - 같은 Slim3-경로에 -이 시점에서 내 토큰을 다시 시도하면210 그리고 잘 작동 - 1시간 - 다른 Slim3-경로에서 :

$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') 
    ] 
]); 

답변서 :

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

새로 고침 토큰 정확히 내가 초기 요청에 도착 것과 동일합니다.

누구나 oauth-client/guzzle/Microsoft Graph에서 경험 한 사람 - 내/어디서 오류가 있습니까? 당신이 V2 엔드 포인트를 사용하고 있기 때문에

+1

욕설을 사용하지 마십시오. –

답변

1

, 당신의 POSThttps://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' 
    ] 
]); 
+0

예 - 그렇게합니다, 마크. https://login.microsoftonline.com/common/oauth2/v2.0/token 엔드 포인트를 요청합니다. 액세스 토큰에 대한 초기 요청이 정상적으로 작동하고 있습니다. – Superpupsi

+0

첫 번째 액세스 토큰이 만료 된 후 다른 Slim3 경로에서 초기 refresh-Token으로 새로운 액세스 토큰을 얻는 것이 문제입니다. 문제가 '리그/오우트 클라이언트'인지 'Slim-DI'-Container인지 아니면 다른 것인지는 모르겠다. – Superpupsi

+0

Thanx Marc,'https : // login.microsoftonline.com/common/oauth2/v2.0/token'에 대한 나의 요청은 잘 동작합니다 - 응답은 새로운 토큰과 새로운 새로 고침 토큰을 포함합니다. – Superpupsi

0

을 - 난 내 리그/oauth-와 마이크로 소프트 그래프를 요청하는 경우

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..." 
} 
: 응답은 다음과 같은 정보가 포함

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

:를 통해 클라이언트와 목구멍

이 정보를 사용하여 응용 프로그램 토큰과 새로 고침 토큰을 갱신하고 Microsoft-Graph 끝점을 계속 요청할 수 있습니다.

고맙습니다. 마크! 큰!