调用/令牌端点不会给我access_token

时间:2018-02-15 05:59:03

标签: azure oauth-2.0 access-token azure-functions azure-ad-b2c

按照指南进行操作:Web sign-in with OpenID Connect -> Get A Token

我正在尝试发帖子请求访问令牌,

HTTP POST: 网址:https://login.microsoftonline.com/[az-directory].onmicrosoft.com/oauth2/v2.0/token?p=B2C_1_SiUpIn

邮政机构:

  

client_id:[Azure功能应用程序的client_id]

     

grant_type:authorization_code

     

范围:https://[url-to-azure-app-api-endpoint] openid offline_access

     

代码:[从登录网址检索的代码]

     

redirect_uri:http://[redirect-uri-used-in-login]

     

client_secret:[天蓝色函数中的秘密客户端ID]

我的回答是:

{
   id_token:...
   token_type:...
   not_before:...
   id_token_expires_in:...
   profile_info:...
   refresh_token:....
   refresh_token_expires_in:...
}

请求正文都不是access_token,尽管链接说的是我会得到的。

我不确定如何从这里开始,是否有可能在我的Azure AD B2C应用程序和它要保护的功能应用程序之间缺少某种权限?

编辑经过进一步调查后,我发现了以下内容:

您使用的登录网址会影响您获得的结果代码令牌(有意义),我正在尝试以下内容:

  

https://login.microsoftonline.com/[ad目录   名] .onmicrosoft.com /的oauth2 / 2.0 /授权P = B2C_1_B2C&安培; CLIENT_ID = [CLIENT_ID]&安培;随机数= defaultNonce&安培; REDIRECT_URI = http://localhost:3000&scope=https://[api   uri] openid offline_access& response_type = code + id_token& prompt = login

使用生成的代码,如果我如上所述向令牌端点发出请求请求,我会获得刷新令牌和ID令牌。

但是我也发现我不需要按链接发送所有的帖子参数,只需传递grant_type,code和client_secret就可以了。由于登录调用似乎实际上控制了您可以使用授权代码访问的范围,因此返回此类有意义,但我不确定为什么上面的链接说您需要传递client_id,scope和redirect_uri。

我可以使用此帖子请求中的id令牌作为授权承载令牌传递到我的azure函数应用程序中,我可以使用刷新令牌调用刷新令牌端点来刷新我可以从中获取的id令牌结果并继续在我的azure功能应用程序中使用。

所以我的问题变成了:这可以接受吗?为什么我的发现与上述链接应该可能有多大不同?我是否还需要访问令牌?

2 个答案:

答案 0 :(得分:1)

Azure AD B2C: Call an ASP.NET Web API from an ASP.NET Web App示例提供了以下指南的逐步指南:

  1. 使用Azure AD B2C注册Web应用程序和Web API。
  2. 允许Web应用程序访问Azure AD B2C中的Web API。
  3. 使用所需设置配置Web应用程序和Web API。
  4. 通过网络应用获取访问令牌,以便与网络API一起使用。

答案 1 :(得分:1)

关于问题的第一部分:

  

我不确定如何从这里开始,我是否可能在我的Azure AD B2C应用程序和它要保护的功能应用程序之间缺少某种权限?

我个人可以连接到Azure AD,如果我不使用策略,我甚至可以连接到Azure B2C。但是,如果我使用策略,那么我就不会获得access_token。

根据azure b2c documentation,我们可以使用openid connect protocol连接到azure。

在规范的successfull token response部分,它说:

  

在从客户端接收并验证有效且授权的令牌请求后,授权服务器返回包含ID令牌和访问令牌的成功响应。

所以我认为你并没有遗漏一些东西,但在我的观点中,因为Azure B2C响应中没有acccess_token,我们可以说Azure B2C不符合openid连接。

现在,我认为应该可以使用一个工作arround来为" openid"添加一个特定的范围。范围,以便像azure文档建议的那样具有access_token:

Azure documentation on AD v2.0 limitations

  

v2.0端点上未实现OpenID Connect UserInfo端点。但是,您可能在此端点接收的所有用户配置文件数据都可从Microsoft Graph / me端点获得。

Azure documentation on tokens

  

v2.0端点允许在Azure AD中注册的第三方应用程序为安全资源(如Web API)发出访问令牌。有关设置应用程序以发出访问令牌的更多信息,请参阅如何使用v2.0端点注册应用程序。在使用v2.0端点注册应用程序时,开发人员可以指定可以发出访问令牌的访问级别,称为范围。例如,Microsoft Graph API中定义的calendars.read范围授予读取用户日历的权​​限。