我有一个Web API试图为B2C用户获取访问权限和刷新令牌。用户登录是通过配置的“社交身份提供商”完成的。
API接收授权码。在为代币交换代码时,Azure AD B2C租户的端点端点返回invalid_grant
错误。
我已经查看了我在网站上找到的其他答案。问题仍然存在。指针非常受欢迎。
详情如下。
注册和登录个人资料会发出
的声明令牌端点出错:
{
"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>'
根据用户授权,API会将授权码POST
发送到令牌端点。 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)
答案 0 :(得分:1)
此错误通常表示您获得的身份验证代码不适用于指定端点上的令牌。这可能是由于错误配置auth端点,在错误的位置注册应用程序或格式错误的请求。要标注的一件事是,大多数B2C错误都是aadb2cxxxxx
的形式,而不是aadstsxxxxx
的传统Azure AD错误格式。
首先要检查此错误是您的auth端点。从上面的片段看,两者看起来都很好。
接下来要确保您使用正确的库来获取授权码。您尚未在客户端上显示代码,但如果它使用ADAL库或v1.0端点,则您的身份验证代码将无法在/v2.0/端点上兑换。
我还看到,当在Azure门户中的不正确的刀片中注册应用程序时会发生这种情况。确保您注册了Azure AD B2C应用程序而不是纯Azure AD应用程序。
如果你这样做了,我建议尝试两件事:
使用其中一个代码示例中的test B2C application而不是您的应用注册,看看它是否有效。如果是,您知道您有注册问题。这个registration guide可能有助于诊断。
使用您的应用注册(而非代码)手动执行请求。这将帮助您了解它是否是代码问题。 Construct the request并使用Curl或Postman,然后交换代码。简单的替代方法是将您的配置插入样本中。
答案 1 :(得分:1)
令牌端点的URL不正确。授权和令牌端点URL需要包含B2C配置文件作为其查询参数的一部分,例如https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token?p=<B2C_profile>
。
或者,您可以分别使用以下URL来授权和令牌端点:
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
B2C_profile
的值为小写。
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
- 声明referring to the policy name正在使用。
此外,B2C使用与声明的令牌发行者不同的签名密钥。确认在验证令牌时使用B2C密钥!