首页 文章

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

提问于
浏览
0

我们正在使用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]详细发现'AppServiceAuthSession'网站'XXXXXX.azurewebsites.net'的Cookie . 长度:728 . 2016-05-29T13:51:19 PID [3600]详细验证XXXXXX@gmail.com使用'Session 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'无法读取此字符串:'Bearer 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]验证详细信息

请建议 .

2 回答

  • 0

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

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

    • 在您的客户端应用中,您必须从Google获取 id_tokenauthorization code . 您通常会在用户使用Google OpenID Connect登录时登录 . 我假设您已经知道如何执行此操作,因为您已经知道如何获取访问令牌 .

    • 使用看起来像 {"authorization_code":"<code>", "id_token":"<id_token>"} 的JSON有效负载向 https:///.auth/login/google 发送POST请求 .

    • 成功的登录响应将包含一个包含authenticationToken字段的JSON有效内容 . 缓存此令牌 .

    • 您可以使用#3中的身份验证令牌对您的Web API进行经过身份验证的调用 . 将它放在x-zumo-auth HTTP请求标头中 .

  • 0
    • 从App Service Portal启用身份验证/授权

    • 浏览到需要身份验证的网络应用或API,您将被重定向到Google登录页面,当您成功进行身份验证时,响应将包含:

    • "id_token":此令牌可以从响应中提取,或者通过访问令牌存储/.auth/me

    • "redirect_uri"此令牌将包含在响应正文中,您也可以在以下步骤中静态设置它,因为这是回调URL,除非您从Google控制台更改它,否则不应更改

    • 使用以下JSON有效内容向{https:// /.auth/login/google发布请求{{redirect_uri“:”“,”id_token“:”“} . 成功的响应将包含“authenticationToken”存储此令牌或缓存它

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

    “x-zumo-auth”,其值为“authenitcationToken”

    Bonus: 为了验证您的令牌,您可以使用以下JSON加载{"id_token":“”}发布到https:// /.auth/login/google,响应应指定令牌是否有效

相关问题