2017-10-18 168 views
1

我有一個Web API試圖爲B2C用戶獲取一組訪問和刷新令牌。用戶登錄通過配置的「社交身份提供商」完成。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_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>' 

在用戶授權,授權碼是POST ED通過API令牌端點。 Payload被表示爲一個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錯誤的格式爲aadb2cxxxxx,而不是傳統的Azure AD錯誤格式aadstsxxxxx

首先要檢查此錯誤是您的auth端點。從上面的片段看,兩者都很好看。

接下來的事情是確保您使用正確的庫來獲取授權碼。您沒有在客戶端上顯示代碼,但是如果它使用的是ADAL庫或v1.0端點,則認證代碼將無法在/v2.0/端點上進行兌換。

我也看到這種情況發生,當一個應用程序在Azure門戶內的不正確刀片中註冊時。確保您註冊了Azure AD B2C應用程序,而不是普通的Azure AD應用程序。

如果你這樣做,我建議您嘗試兩兩件事:

  1. 從代碼樣本,而不是您的應用程序註冊一個使用test B2C application,看看它是否工作。如果是這樣,你就知道你有一個註冊問題。這registration guide可能有助於診斷。

  2. 使用您的應用程序註冊(而不是代碼)手動執行請求。這將幫助您瞭解它是否是代碼問題。 Construct the request並使用Curl或Postman,然後交換代碼。簡單的選擇是將你的配置插入到示例中。

+0

看起來問題是應該是'https://login.microsoftonline.com/te/ .onmicrosoft.com//oauth2/v2.0/token'的令牌端點URL。除了一些提及'https://login.microsoftonline.com/tfp/ ...'外,我在B2C文檔中找不到任何這方面的參考資料。這是最近的變化嗎? – MrBink

+0

這很奇怪,我會與B2C團隊簽到。 –

+1

有三種方法可以定位Azure AD B2C: 1.使用您使用的URL(在路徑中沒有te或tfp)並指定策略作爲查詢參數(p = policyName) 2.沿着路徑使用te與b2c政策名稱 3.在路徑中使用tfp以及b2c策略名稱 – Parakh

1

標記端點的URL不正確。授權和令牌端點URL需要包含B2C簡檔作爲其查詢參數的一部分,例如, https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token?p=<B2C_profile>

或者,也可以使用下面的網址,以授權和分別令牌端點:

  • https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/oauth2/v2.0/authorize
  • 價值 B2C_profile
  • 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密鑰!

相關問題