0

我们正在使用应用服务身份验证来保护Web API并将Google用作身份验证提供程序。它的工作原理,当我们火从浏览器的请求(当会话信息的cookie中)使用Google oAuth 2.0承载令牌进行Azure应用服务身份验证

IIS日志按预期:

2016-05-29T13:51:19 PID放牧收到[3600]请求:GET https://XXXXXX.azurewebsites.net/api/user 2016-05-29T13:51:19 PID [3600] Verbose为站点 'XXXXXX.azurewebsites.net'找到'AppServiceAuthSession'cookie。长度:728. 2016-05-29T13:51:19 PID [3600]详细使用'Session Cookie'认证成功验证了[email protected]

但是,当我们使用API​​测试工具,如邮差,并设置授权头与承载令牌,它总是导致重定向。

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-谟-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'。 字符串需要在紧凑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]

验证详情请建议。

回答

0

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

我没能找到这个良好的文档,但我可以告诉你,在这里工作,而不是:

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

Chris,我们从未到达第3步,因为服务器返回内部服务器错误。 –

+0

使用Google,我们首先获取auth_code,然后在随后的请求中使用它来获取id_token。 https://developers.google.com/identity/protocols/OpenIDConnect#server-flow IIS日志: 警告呼叫HTTP端点https://www.googleapis.com/oauth2/v4/token失败:400(错误的请求)。部分响应:{ “错误”:“invalid_grant”, “error_description”:“代码已被兑换。” } ..如果重播先前使用的认证码,也会发生这种情况。 –

+0

错误是有道理的。您可以使用Google的授权流程,在一个响应中返回授权码和id_token吗?例如“response_type = code id_token”? https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters。或者,如果您使用Android,是否可以通过一些Android API调用独立获取auth_code和id_token? –

相关问题