2017-10-18 171 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密钥!

相关问题