【问题标题】:Best practice for id_token vs. access_token use in AWS Lambda在 AWS Lambda 中使用 id_token 与 access_token 的最佳实践
【发布时间】:2021-03-07 18:20:05
【问题描述】:

考虑一个由 AWS-ApiGateway 和 -Lambda 组成的 restapi 后端。

在成功进行 oauth2 身份验证后,AWS Cognito 在代码授权授予流程中向客户端返回 access_tokenid_token

在api调用时,lambda函数需要知道认证客户端的email地址,所以我基本上有2个选择:

  1. Authorization 标头中发送 id_token,该标头由 ApiGateway 验证并传递给 Lambda。让 Lambda 解密 id_token 并访问其中包含的电子邮件地址。
  2. Authorization 标头中发送 access_token,该标头由 ApiGateway 使用 scope=openid email 验证并传递给 Lambda。让 Lambda 使用 Authorization 标头中的 access_token/oauth2/userinfo 端点进行 GET 调用以获取电子邮件地址。

两者哪一个是最佳做法?为什么?

【问题讨论】:

    标签: amazon-web-services api authentication oauth-2.0 openid


    【解决方案1】:

    好问题:

    • 访问令牌被设计为短暂的 API 凭据,包含范围/声明等
    • Id 令牌具有不同的作用,用于向客户端提供身份验证证明,如我的blog post

    但是,如果您使用的是 AWS Cognito,则存在供应商限制,即无法自定义访问令牌 - 例如包含电子邮件地址。

    因此,API 或网关通常会在第一次收到令牌时做更多的工作 - 例如查找用户信息或来自其他来源的声明 - 然后将它们缓存起来以用于具有相同访问令牌的后续请求。

    也就是说,选项 2 是首选,而不是以不自然的方式使用 id 标记。

    有关此设计模式的更多信息,请参阅:

    不确定您是否正在研究 API Gateway 自定义授权方,但如果是,我的博客中有一些关于此 here 的内容

    【讨论】:

    • 为什么 AWS Cognito 决定不将电子邮件声明作为访问令牌的一部分包含在内,我无法理解。至少他们应该提供它作为包含它的选项。
    • 缺乏对访问令牌中声明处理的支持并不好。不过,您可以通过将访问令牌发送到用户信息端点来获取电子邮件。
    • 是的,但是解决方法(调用用户信息端点,或实现您自己的后端电子邮件字段等)破坏了使用令牌的好处之一,即不必为每个 API 交互进行数据库查找或缓存查找如果您依赖电子邮件字段。但我同意至少你可以绕过它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2015-02-05
    • 2018-03-22
    • 2019-02-10
    相关资源
    最近更新 更多