2017-10-13 26 views
0

Microsoft Graphで動作するSlim3 WebAppでguagueでleague/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-Routeのリダイレクト後のI得たすべてのトークン、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-ルートで:

$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で何人かの経験がある方 - 私の/なんですか?

+1

冒涜を避けてください。 –

答えて

1

あなたはv2のエンドポイントを使用しているので、あなたの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-Routeで新しいrefreshトークンを持つ新しいアクセストークンを取得することです。私は、問題が「リーグ/オオス - クライアント」、「Slim-DI」コンテナ、または何か他のものであるかどうかわかりません...? – Superpupsi

+0

Thanx Marc、 'https:// login.microsoftonline.com/common/oauth2/v2.0/token'への私のリクエストはうまくいきます - レスポンスには新しいトークンと新しいリフレッシュトークンが含まれています。 – Superpupsi

0

例えば - 私は私のリーグ/ oauth-でのMicrosoft-グラフを要求した場合応答は、以下の情報が含まれてい

 $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エンドポイントを要求し続けることができます。

ありがとう、マーク!すばらしいです!

関連する問題