2017-10-18 11 views
1

私は、B2Cユーザーのアクセストークンと更新トークンを取得しようとしているWeb APIを持っています。ユーザーサインインは、構成済みの「ソーシャルIDプロバイダ」を介して実行されます。Azure AD B2CがトークンリクエストでAADSTS70000エラーを返します

APIは認証コードを受け取ります。トークンのコードを交換するとき、Azure AD B2Cテナントのエンドポイントエンドポイントはinvalid_grantエラーを返します。

私はサイトで見つけた他の回答を見てきました。まだ問題は残っています。ポインタは非常に感謝しています。

詳細は次のとおりです。

サインアップとサインでプロファイル名

  • メール
  • アイデンティティプロバイダトークンエンドポイントから
  • オブジェクトID
  • エラーを考える

    • の発行の請求:

      { 
          "error": "invalid_grant", 
          "error_description": "AADSTS70000: Transmission data parser failure: Authorization Code is malformed or invalid. [...]", 
          "error_codes": [ 
           70000 
          ], 
          [...] 
      } 
      

      次のようにAuthorizationリクエストに見える:ユーザー認証、認可コード際

      AUTHORIZATION_ENDPOINT = 'https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/authorize' 
      
      authorization_url = f'{AUTHORIZATION_ENDPOINT}' \ 
          f'?client_id={CLIENT_ID}' \ 
          f'&response_type=code' \ 
          f'&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fcode' \ 
          f'&scope=openid offline_access' \ 
          f'&nonce=hellobob' \ 
          f'&p=B2C_1_<profile>' 
      

      は、エンドポイントをトークンにAPIによってPOST編です。ペイロードはPython辞書として表されます。

      TOKEN_ENDPOINT = 'https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token' 
      payload = { 
          'p': 'B2C_1_<profile>', 
          'client_id': CLIENT_ID, 
          'client_secret': CLIENT_SECRET, 
          'code': code, 
          'grant_type': 'authorization_code', 
          'redirect_uri': 'http://localhost:8000/code', 
          'scope': 'openid offline_access' 
      } 
      
      response = requests.post(TOKEN_ENDPOINT, data=payload) 
      

    答えて

    1

    このエラーは、取得した認証コードが、指定されたエンドポイントのトークン用ではないことを意味します。これは、認証エンドポイントの誤った設定、間違った場所へのアプリの登録、または不正なリクエストから起こります。多くのB2Cエラーは、伝統的なAzure ADエラーフォーマットaadstsxxxxxではなく、aadb2cxxxxxの形式になっています。

    このエラーで最初に確認するのは、認証のエンドポイントです。上のスニペットから、どちらも良いように見えます。

    次に、正しいライブラリを使用して認証コードを取得していることを確認してください。クライアントにコードを表示していませんが、ADALライブラリまたはv1.0エンドポイントを使用している場合、認証コードは/v2.0/エンドポイントでは使用できません。

    これは、アプリがAzureポータル内の不正なブレードに登録されている場合にも発生します。 Azure ADアプリケーションではなくAzure AD B2Cアプリケーションを登録してください。

    あなたはこれをやった場合、私は2つのことを試してみることをお勧め:

    1. は、コードサンプルの一つではなく、アプリの登録からtest B2C applicationを使用し、それが動作するかどうかを確認。もしそうであれば、あなたは登録問題があることを知っています。このregistration guideは診断に役立ちます。

    2. (コードではなく)アプリ登録を使用して手作業でリクエストを行います。これは、コードの問題かどうかを理解するのに役立ちます。 Construct the requestとし、CurlまたはPostmanを使用してコードを交換してください。簡単な選択肢は、あなたの設定をサンプルに接続することです。

    +0

    トークンのエンドポイントURLは、https://login.microsoftonline.com/te/ .onmicrosoft.com//oauth2/v2.0/token'だったはずです。 'https://login.microsoftonline.com/tfp/ ... 'という言葉を除いて、私はB2Cのドキュメントでこれを参照することはできません。これは最近の変更ですか? – MrBink

    +0

    それは奇妙なことですが、私はB2Cチームにチェックインします。 –

    +1

    Azure AD B2Cをターゲットにするには、次の3つの方法があります。 1.使用したURLを使用して(パスにteまたはtfpを付けずに)、ポリシーをクエリパラメータとして指定します(p = policyName) 2. path b2cポリシー名 3.パスのtfpをb2cポリシー名と共に使用する – Parakh

    1

    トークンエンドポイントのURLが正しくありませんでした。認可トークンとトークンのエンドポイントURLには、クエリパラメータの一部としてB2Cプロファイルが含まれている必要があります。 https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token?p=<B2C_profile>

    また、あなたはそれぞれの権限とトークンエンドポイントに次のURLを使用することができます。B2C_profile

    • https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/oauth2/v2.0/authorize
    • https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/oauth2/v2.0/token

    値は小文字です。

    OpenID発見ドキュメントは、https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/v2.0/.well-known/openid-configurationから入手できます。

    OpenIDプロバイダ設定文書では、基になるAzure ADがトークン発行者として記載されているため、トークンがAzure ADかB2Cかを判断することは困難です。しかし、B2Cトークンは、tfp -claim referring to the policy nameが使用されているように見えます。

    さらに、B2Cは、要求されたトークン発行者とは異なる署名鍵を使用します。トークンの検証時にB2Cキーを使用するようにしてください!

    関連する問題