2017-09-29 5 views
1

Azure AD OpenID接続フレームワークを使用して、WebベースのJavaアプリケーションの認証サービスを開発しています。私は参照していますadal4j-1.2.0.jar 認証は動作ごとに行われています。私はJWTの請求権を取得しており、それを検証することができます。Azure AD Adal4jリフレッシュトークンが署名されていないトークンが受信されましたJWT

しかし、60分のセッションタイムアウトが発生し、リフレッシュトークンを使用して新しいトークンクレームを取得しようとしている場合、新しいトークンはSigned JWTではありません。彼らはプレーンJWTです。

キャッシュしている初期リフレッシュトークンを使用してトークンを取得するために、以下の呼び出しを使用しています。トークンの検証のため

acquireTokenByRrefreshToken(refreshtoken, credential,null,null) 

は、私は誰も私が私が新しい署名付きトークンを取得するためのリフレッシュトークンを引き換えることができる方法を理解するのを助けることができる

IDtokenValidator validator = new IDTokenValidator(issuer,clientID, JWSAlgo,URL) 
validator.validate(idToken, exoectedNoounce); //this line throws badjwtexception signed ID token expected 

以下のようなコードを使用しています。または、トークンを償還した後、新しいトークンは常にプレーンJWTです。

答えて

1

トークンを取得するために暗黙的な許可フローを使用していると思われます。許可エンドポイントからトークンを取得しています。このフローでは、更新トークンは取得されません。セッションの有効期限が切れた後に新しいトークンを取得するか、セッションが期限切れになる前にトークンを取得できる隠しフレーム。

+0

セッションが期限切れになった後に新しいトークンを取得するには、これを追加するだけです。リソース(URL)は、返信URLとしてAzure ADに登録されているものと同じである必要があります。しかし、セッションが終了すると、ユーザーは別のURLにいる可能性があります。新しいリクエストが送信された場合、返信URLが一致しないというエラーページが表示されます。 –

+0

この場合、コード許可フローまたはクライアント信用証明フローを使用することができます。まず、ユーザーを検証してから、このコードをクライアントシークレットとともに送信して、トークン+リフレッシュトークンを取得します。ライブラリにコード許可フローを呼び出すメソッドがあります。 –

0

official docを参照してaccess tokenrefresh tokencode grant flowで取得することができます。

実際にadal4jのメソッドはHTTP REST APIで実装されていますので、以下のコードを参照してAuthorizationCodeをリクエストしてください。

public static void getAuthorizationCode() throws IOException { 

     String encoding = "UTF-8"; 
     String params = "client_id=" + clientId 
       + "&response_type=" + reponseType 
       + "&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F" 
       + "&response_mode=query" 
       + "&resource=https%3A%2F%2Fgraph.windows.net" 
       + "&state=12345"; 
     String path = "https://login.microsoftonline.com/" + tenantId + "/oauth2/authorize"; 
     byte[] data = params.getBytes(encoding); 
     URL url = new URL(path); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("POST"); 
     conn.setDoOutput(true); 
     conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     conn.setRequestProperty("Content-Length", String.valueOf(data.length)); 
     conn.setConnectTimeout(5 * 1000); 
     OutputStream outStream = conn.getOutputStream(); 
     outStream.write(data); 
     outStream.flush(); 
     outStream.close(); 
     System.out.println(conn.getResponseCode()); 
     System.out.println(conn.getResponseMessage()); 

     BufferedReader br = null; 
     if (conn.getResponseCode() != 200) { 
      br = new BufferedReader(new InputStreamReader((conn.getErrorStream()))); 
     } else { 
      br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); 
     } 
     System.out.println("Response body : " + br.readLine()); 
    } 

次に、あなたが得たAuthorizationCodeを使用してaccess tokenを取得し、以下のコードを使用してリフレッシュコードを得ることができます。

public static void getToken(String refreshToken) throws IOException { 

     String encoding = "UTF-8"; 
     String params = "client_id=" + clientId + "&refresh_token=" + refreshToken 
       + "&grant_type=refresh_token&resource=https%3A%2F%2Fgraph.windows.net"; 
     String path = "https://login.microsoftonline.com/" + tenantId + "/oauth2/token"; 
     byte[] data = params.getBytes(encoding); 
     URL url = new URL(path); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("POST"); 
     conn.setDoOutput(true); 
     conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     conn.setRequestProperty("Content-Length", String.valueOf(data.length)); 
     conn.setConnectTimeout(5 * 1000); 
     OutputStream outStream = conn.getOutputStream(); 
     outStream.write(data); 
     outStream.flush(); 
     outStream.close(); 
     System.out.println(conn.getResponseCode()); 
     System.out.println(conn.getResponseMessage()); 

     BufferedReader br = null; 
     if (conn.getResponseCode() != 200) { 
      br = new BufferedReader(new InputStreamReader((conn.getErrorStream()))); 
     } else { 
      br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); 
     } 
     System.out.println("Response body : " + br.readLine()); 
    } 

希望します。

+0

ありがとうございます。 'acquireTokenByRrefreshToken(refreshtoken、credential、resource、null) ' を呼び出すことで新しいaccess_token、Id_token、refresh_tokenを取得できます。セッションオブジェクトで新しいトークンを使用する方法を理解できません。私は60分後に失われるセッションオブジェクトにいくつかのパラメータを設定しています。したがって、新しいトークンを追加する必要があります。 –

関連する問題