使用Google oAuth 2.0承载令牌进行Azure应用服务身份验证

时间:2016-05-30 06:29:12

标签: google-oauth azure-web-sites service-accounts bearer-token

我们正在使用App Service身份验证来保护Web API并使用Google作为身份验证提供程序。当我们从浏览器发出请求时(当会话信息在cookie中时),它按预期工作

IIS日志:

  

2016-05-29T13:51:19 PID [3600]详细收到请求:GET   https://XXXXXX.azurewebsites.net/api/user 2016-05-29T13:51:19   PID [3600] Verbose Found' AppServiceAuthSession'网站的cookie   ' XXXXXX.azurewebsites.net&#39 ;.长度:728。2016-05-29T13:51:19   PID [3600]详细验证XXXXXX@gmail.com成功   使用'会话Cookie'认证

但是当我们使用Postman等API测试工具并使用bearer token设置 Authorization 标头时,它总是会导致重定向。

IIS日志:

  

2016-05-29T13:53:38 PID [3600]详细收到请求:POST   https://XXXXX.azurewebsites.net/api/user 2016-05-29T13:53:38   PID [3600]信息重定向:   https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=XXXXXXX-XXXXX7attpunn9smo4.apps.googleusercontent.com&redirect_uri=https%3A%2F%2FXXXXXX.azurewebsites.net%2F.auth%2Flogin%2Fgoogle%2Fcallback&scope=openid+profile+email&state=nonce%3De5f4aabe11cb4544bf18d00920940d47_20160529135838%26redir%3D%2Fapi%2Fuser

我们还尝试使用相同的承载令牌设置 X-ZUMO-AUTH 标头,我们看到错误,因为令牌不是预期的格式。显然它需要编码的JWT令牌。

IIS日志:

  

016-05-29T13:51:52 PID [3600]详细收到请求:POST   https://XXXXXX.azurewebsites.net/api/user 2016-05-29T13:51:52   PID [3600]警告JWT验证失败:IDX10708:   ' System.IdentityModel.Tokens.JwtSecurityTokenHandler'看不懂这个   字符串:'持票人   ya29.XXXXXXXXXX_RDrX_zsuvMx49e_9QS5ECz9F1yhDHe5j4H9gRN6opkjLXvN1IJZjHXa_Q&#39 ;.   字符串需要采用紧凑的JSON格式,格式如下:   ' ..' .. 2016-05-29T13:51:52 PID [3600]   信息重定向:   https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=XXXXXXX-k5nj6dkf987attpunn9smo4.apps.googleusercontent.com&redirect_uri=https%3A%2F%2FXXXXXX.azurewebsites.net%2F.auth%2Flogin%2Fgoogle%2Fcallback&scope=openid+profile+email&state=nonce%3De15b0915406142378XXXXX_20160529135652%26redir%3D%2Fapi%2Fuser

注意: 从Google获得的持有人令牌是有效的,因为我们可以通过拨打来验证详细信息 https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=[token]

请建议。

2 个答案:

答案 0 :(得分:0)

您使用的Google令牌是访问令牌,而不是持票人令牌。它可用于访问Google资源,但不能用于通过Web API进行身份验证。

我无法找到关于此的良好文档,但我可以告诉你它在这里工作:

  1. 在您的客户端应用中,您必须从Google获取 id_token 授权码。您通常会在用户使用Google OpenID Connect登录时登录。我假设您已经知道如何执行此操作,因为您已经知道如何获取访问令牌。
  2. https:// {hostname} /.auth/login/google 发送POST请求,其中JSON有效内容类似于{"authorization_code":"<code>", "id_token":"<id_token>"}
  3. 成功的登录响应将包含一个包含authenticationToken字段的JSON有效内容。缓存此令牌。
  4. 您可以使用#3中的身份验证令牌对您的Web API进行经过身份验证的调用。将它放在x-zumo-auth HTTP请求标头中。

答案 1 :(得分:0)

  1. 从App Service门户打开身份验证/授权

  2. 浏览到需要身份验证的Web应用程序或API,您将被重定向到google登录页面,当您成功进行身份验证时,响应将包含:

    • “ id_token”:可以从响应中提取此令牌,也可以通过访问令牌存储/.auth/me
    • “ redirect_uri”此令牌将包含在响应正文中,您也可以在接下来的步骤中对其进行静态设置,因为这是回调URL,除非您从google控制台进行更改,否则不要更改它
  3. 使用以下JSON有效负载{“ redirect_uri”:“”,“ id_token”:“”}向https:// {hostname} /.auth/login/google发送请求。成功的响应将包含“ authenticationToken”,用于存储此令牌或对其进行缓存

  4. 对需要身份验证的API的后续请求应包含HTTP请求标头:

    值为“ authenitcationToken”的“ x-zumo-auth”

奖金: 为了验证您的令牌,您可以使用以下JSON有效负载{“ id_token”:“”} POST到https:// {hostname} /.auth/login/google,响应中应指定令牌是否有效