0

我正在使用部署在 Amazon Elastic Kubernetes Service ( EKS ) 上的 Web 应用程序。用户身份验证通过 Okta 完成。一切正常,但如果我已登录,我希望 Web 应用程序显示我的姓名,即当前用户的姓名。

有一篇博客文章详细描述了我所拥有的设置类型,这也是通过 Terraform 完成的。到目前为止,我对此的在线搜索使我找到了有关如何设置身份验证(已经完成)而不是如何获取当前用户的答案。

我的基本理解是:原始请求发送到应用程序负载均衡器 (ALB),并使用 Okta 处理身份验证。最终结果是一个会话 cookie,应用程序通过浏览器将其与未来的请求一起发送,以便它们最终到达后端可以响应的目标 IP。这是AWS 文档中有关身份验证流程的相关文本:

“负载均衡器验证 ID 令牌后,它会与 IdP 用户信息端点交换访问令牌以获取用户声明。

负载均衡器创建身份验证会话 cookie 并将其发送到客户端,以便客户端的用户代理可以在发出请求时将 cookie 发送到负载均衡器。”

我可以从负载均衡器侦听器规则中看到有一个用户信息端点:https ://myorg.okta.com/oauth2/v1/userinfo但客户端应用程序可以使用它来检索用户详细信息,如果可以,如何? 我尝试curl使用会话 cookie 但收到 400 错误。

Okta 网站上还记录了一个 API ,它“获取链接到 API 令牌或会话 cookie 的当前用户”:

curl -v -X GET \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: SSWS ${api_token}" \
"https://${yourOktaDomain}/api/v1/users/me"

我没有 API 令牌,所以我尝试使用AWSELBAuthSessionCookie但得到:

{"errorCode":"E0000011","errorSummary":"Invalid token provided","errorLink":"E0000011","errorId":"oaeRNui7fSPQIq_LWuGro5EbV","errorCauses":[]}

任何带有步骤摘要和相关文档链接的答案都会很棒。谢谢你。

4

1 回答 1

0

用户信息总是由 ALB 在来自客户端的每个请求的标头中发送到应用程序(目标),因此后端将需要处理它并以某种方式使其可用于前端。可能最简单的方法是将其包含在响应中。

答案实际上在有关用户声明的文档中更进一步:

在您的负载均衡器成功验证用户身份后,它将从 IdP 收到的用户声明发送到目标。负载均衡器对用户声明进行签名,以便应用程序可以验证签名并验证声明是由负载均衡器发送的。

负载均衡器添加以下 HTTP 标头:

x-amzn-oidc-accesstoken 来自令牌端点的访问令牌,采用纯文本格式。

x-amzn-oidc-identity 来自用户信息端点的主题字段(子),采用纯文本格式。

x-amzn-oidc-data 用户声明,采用 JSON Web 令牌 (JWT) 格式。

最后一个标题正是我所需要的。它包含所有用户信息,Base64 编码。值得注意的是,我已经找到了日志,x-amzn-oidc-data但一无所获。但是在通过管道将请求日志传输到进行不区分大小写的搜索之后,我发现了很多带有标题grep -i x-amzn-oidc-data的条目。X-Amzn-Oidc-Data

顺便说一句,我使用mitmproxy记录对应用程序的每个请求,包括标头,结果证明对于找到此解决方案非常有用!

于 2020-06-04T15:58:12.467 回答