如何通过调用 HTTP API 网关 + Lambda(已使用 Amazon Cognito 用户池进行身份验证)获取用户详细信息

2024-05-04

用户登录 Amazon Cognito,应用程序/Web 会获取一个“访问令牌”,每当调用 API 网关(HTTP API 或 REST API)时都会使用该令牌。

API 网关配置为使用 Cognito 用户池作为授权者,因此如果“访问令牌”有效,则调用可以传递给 Lambda。

那么,我如何(在 Lambda 内部)知道谁是进行呼叫的用户以及他/她的详细信息是什么?


This https://stackoverflow.com/a/58686493/4752223答案让我走上了一条简单的道路,但我意识到还有一条更容易的道路。

如果您像这样转储 Lambda(python 代码)收到的内容。

然后像这样调用 API(GET/POST/其他取决于您如何定义 API)

# curl --request GET  --header "Authorization: ${TOKEN}"   "${GATEWAY_URL}"

你会得到一堆文字。将其粘贴到https://jsonformatter.curiousconcept.com/ https://jsonformatter.curiousconcept.com/很好地格式化它,你会发现在事件中你有很多信息,比如

{
  "version":"2.0",
  "routeKey":"ANY /*****",
  "rawPath":"/default/****",
  "rawQueryString":"",
  "headers":{
     "accept":"*/*",
     "authorization":"eyJraW...QiOi",
     "content-length":"0",
     "host":"*******.execute-api.eu-west-1.amazonaws.com",
     "user-agent":"curl/7.52.1",
     "x-amzn-trace-id":"Root=1-5ff1***eee7347",
     "x-forwarded-for":"**.**.243.124",
     "x-forwarded-port":"443",
     "x-forwarded-proto":"https"
  },
  "requestContext":{
     "accountId":"****",
     "apiId":"*****",
     "authorizer":{
        "jwt":{
           "claims":{
              "at_hash":"-pO***Eg",
              "aud":"1jk***0n0",
              "auth_time":"160***928",
              "cognito:username":"357d***a77de4d",
              "email":"***@gmail.com",
              "email_verified":"true",
              "event_id":"19f7e***dc0e80",
              "exp":"16***28",
              "iat":"16***928",
              "iss":"https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_***8z",
              "name":"UserName",
              "sub":"357***77de4d",
              "token_use":"id"
           },
           "scopes":"None"
        }
     },
     "domainName":"***.execute-api.eu-west-1.amazonaws.com",
     "domainPrefix":"***",
     "http":{
        "method":"GET",
        "path":"/default/***",
        "protocol":"HTTP/1.1",
        "sourceIp":"***",
        "userAgent":"curl/7.52.1"
     },
     "requestId":"Yi***sA=",
     "routeKey":"ANY /***",
     "stage":"default",
     "time":"02/Jan/2021:23:45:15 +0000",
     "timeEpoch":1609631115197
  },
  "isBase64Encoded":false
}

也就是说,所有用户详细信息都在那里,您无需执行任何操作即可获取它们。

特别是,这 2 个在这里

event["requestContext"]["authorizer"]["jwt"]["claims"]["email"]
event["requestContext"]["authorizer"]["jwt"]["claims"]["name"]

这具有更好的含义。

您可以利用 HTTP API Gateway + Lambda 来:

  • 验证访问令牌(如果无效或过期,您将收到“未经授权”响应)
  • 提取令牌范围/详细信息

所有这一切都在 130 毫秒内完成(您只需支付 3 毫秒的费用)。无需加载库,无需操作数据,无需手动解码,没有废话。

唯一需要的工作是配置用户池和 API 网关(HTTP 或 REST 类型)来为您进行身份验证。


如果您想知道从哪里获取 TOKEN 的值,它会在成功登录 Cognito 后调用的 URL 上进行编码。

请注意,您可能会在响应 URL 中获取 2 个令牌:ID_TOKEN 和 ACCESS_TOKEN。要获取用户详细信息,您需要使用 ID_TOKEN 调用 API。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过调用 HTTP API 网关 + Lambda(已使用 Amazon Cognito 用户池进行身份验证)获取用户详细信息 的相关文章

  • 亚马逊 AWS CloudFront 声称不存在这样的存储桶

    我正在尝试设置 CloudFront 来提供图像 但当前无法访问它并返回错误 指定的存储桶不存在
  • 使用 python boto3 管理 Route53 中具有多个 IP 的 A 记录

    我的route53中有一条A记录 后面有多个IP 例子 A record dummy xyz com 点IPs 1 1 1 1 2 2 2 2 和 3 3 3 3路由策略 Simple 我使用下面的代码来更新单个 IP 的记录 Change
  • 如何在 access_token 中添加角色声明,目前它是在 id_token 中?

    我正在使用 PKCE 跟踪身份验证代码流 我的身份提供程序是 Azure Active Directory 我从应用程序注册创建了一个应用程序 客户端应用程序 在清单中 我添加了如下所示的 appRoles appRoles allowed
  • 输出和导出之间的区别

    在 CloudFormation 中 我们能够从模板输出一些值 以便其他进程 堆栈等可以检索它们 这通常是某个名称 可能是 URL 或在堆栈创建 部署 过程中生成的名称等 我们还能够从模板 导出 返回值作为 输出 与 导出 之间有什么区别
  • 具有服务器端加密 s3 存储桶的 AWS Cloudfront

    这是对这个问题 https stackoverflow com questions 50166557 how can a cloudfront distribution an aws kms key to get an s3 image e
  • AWS SQS Batch SendMessageBatchRequest 非常慢

    我的应用程序使用 SendMessageBatchRequest 将每个请求发布 10 条消息到 AWS SQS 每条消息的大小小于250字节 该应用程序预计每天发布约一百万条记录 但要实现这一目标 消息发布的速度非常慢 AmazonSQS
  • 每次在我的 AWS SQS 目标上推送通知时如何触发事件?

    我正在将 AWS SQS 用于 Amazon MWS 订单 API 每当有人从已将我添加为其开发人员的卖家帐户订购时 亚马逊都会将通知发送到我的 AWS SQS 应用程序 我可以从那里提取通知 但为此 我必须创建一个调度程序来提取通知 我是
  • NestJs + Passport - JWTStrategy 永远不会用 RS256 令牌调用

    我正在尝试在 Nestjs 后端实现 RS256 JWT 令牌 我按照中提供的示例进行操作Nestjs 文档 https github com nestjs nest tree master sample 19 auth 在我的模块中我注册
  • 将密钥对添加到现有 EC2 实例

    我被给予AWS控制台访问正在运行 2 个实例的帐户 但我无法关闭 在生产中 但是 我想获得对这些实例的 SSH 访问权限 是否可以创建一个新的密钥对并将其应用到实例 以便我可以通过 SSH 访问 获取现有的pem当前无法选择创建实例所用的密
  • 使用S3上传但不允许公共访问

    我的想法是创建一个 S3 存储桶以允许用户上传二进制对象 下一步是确认上传 然后 API 将启动文件处理 为了使其更安全 客户端将首先请求上传位置 然后 API 会在 S3 上为此上传分配并预先创建一个一次性使用目录 并在该目录上设置访问策
  • 带有 AWS S3 文件的 Icecast 服务器

    我目前正在运行 Icecast 服务器 用于在 EC2 实例上传输音频 目前我所有的 mp3 文件都存储在 EC2 实例上 我想将它们移动到 AWS S3 进行存储 到目前为止 我已经能够找到能够更新播放列表 https mediareal
  • AWS Elastic Beanstalk 一次也不会部署我的 Rails 应用程序

    我目前正在使用 Ruby 2 6 running on 64bit Amazon Linux 2 3 0 2 图像 并通过查看EC2实例内部的 var logs eb engine log eb logs 命令不会 t 告诉我这个 反复出现
  • 从 Amazon S3 存储桶下载文件的脚本

    尝试编写脚本以从 Amazon S3 存储桶下载文件 cURL 网站上的示例遇到问题 下面的脚本产生 我们计算的请求签名与您的签名不匹配 假如 检查您的密钥和签名方法 感谢任何帮助 bin sh file filename php buck
  • AWS S3 上传的图像已损坏

    我正在 AWS ec2 ubuntu 机器上工作 我的代码在 cakephp 中 当我尝试将任何图像上传到 AWS S3 时 它都会损坏 虽然它在核心 php 代码中运行良好 这是我的控制器代码 if this gt User gt sav
  • 如何自动启动我的 ec2 实例、运行命令然后将其关闭?

    我想每周对 redshift postgres 数据库中的数据运行一次机器学习模型 我使用以下命令将 R 脚本设置为休息 apiplumbr然后我将其设置为一项任务来管理pm2 我有它 所以任务会在ec2实例启动然后继续运行 要让 R 脚本
  • AWS cognito 用户迁移池触发器不适用于登录流程

    我正在使用带有认知执行角色的 Lambda 函数进行 AWS 认知池迁移 以下是我的新池应用程序客户端设置 or AWS doc says 用户迁移身份验证流程 用户迁移 Lambda 触发器 允许从旧用户管理系统轻松迁移用户 进入您的用户
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 如何在没有 x5c 的情况下验证来自 jwks 的 JWT 签名

    我有一个 JWT 安全令牌 需要通过 jwks 端点进行验证 jwks 中的数据如下所示 keys kty RSA e AQAB use sig alg RS256 n kid 2132132 b1e6 47e7 a30f 1831942f
  • AWS lambda 是否保证将函数更新到新版本时不会出现停机?

    默认情况下 AWS 使用LATEST更新了最新 lambda 版本的别名 我假设执行以下步骤 Now LATEST别名点版本 5 用户部署新版本的 lambda 在部署新版本时 LATEST别名仍然指向版本 5 部署完成后 Lambda 只
  • AWS DynamoDB 写后读一致性 - 理论上它是如何工作的?

    大多数nosql解决方案仅使用最终一致性 并且考虑到DynamoDB将数据复制到三个数据中心 如何保持写后读一致性 解决此类问题的通用方法是什么 我认为这很有趣 因为即使在 MySQL 复制中 数据也是异步复制的 我将详细告诉您 Dynam

随机推荐

  • 在实体框架中使用 Asp.net Identity 抛出无法从程序集“EntityFramework,版本=6.0”加载类型“.Schema.IndexAttribute”

    public EmployeeDTO AuthenticateEmployee string username string password try var userLogin UnitOfWork UserLoginRepository
  • 将 PhotoSwipe 配置为不使用整个窗口?

    我目前正在尝试使用构建移动图片库照片滑动 http photoswipe com 我已经能够让它工作了 但有一个小问题 当我 单击照片缩略图 实际照片总是占据整个 视口 当您在移动设备上查看图库时 这是可以的 但是 如果您的视口是计算机屏幕
  • 托管 C++ 引用类

    任何好的网站或解释什么是ref class何时将一个类声明为 引用类 msdn上的解释对我来说还不够 基本类型 可选 一个基础类型 引用类或引用结构可以继承零个或多个托管接口以及零个或一个引用类型 值类或值结构只能从零个或多个托管接口继承
  • git 克隆密码存储或缓存在哪里?

    环境定义 使用Windows 10操作系统 我使用 githttps git scm com https git scm com 和 Github 的 Git Shell 背景 当我发出如下所示的 git clone 命令时 git clo
  • Prism 6 与旧版本的兼容性

    我有一个使用 Prism 5 WPF 的主项目的解决方案 该解决方案还包含更多属于 Prism 模块的项目 现在我必须创建一个新模块 我想知道我是否只能在该模块中使用 Prism 6 并且它将与 Prism 5 主项目兼容 或者我是否需要在
  • 在 Python 中读取 .docx 文件以查找删除线、项目符号和其他格式

    任何人都可以帮助我在使用 python docx 的 Python 中识别 docx 文件中的段落是否包含带有删除线格式的文本 即它出现但被划掉 或者在开头有一个项目符号点 我正在尝试编写一个脚本来识别文档中的结构并解析内容 到目前为止 我
  • 新 WordPress 网站中出现奇怪的 url 重写问题

    我刚刚在 AWS EC2 主机中设置了一个新的 Wordpress 站点 其 DNS 主机名如下 http ec2 34 230 30 128 compute 1 amazonaws com 一切正常 所以我继续设置一个友好的域名 word
  • MySQL 错误:无法创建表(errno:121“写入或更新时重复键”)

    我使用 MySQL Workbench 生成数据库的图表和代码 当我将代码放入 phpMyAdmin 时 它显示错误 1005 无法创建表wypozyczalnia wypozyczenie 错误号 121 写入或更新时密钥重复 哪里有问题
  • 运行 TensorFlow 时使用 CNMeM 有什么意义吗?

    The CNMeM 库 https github com NVIDIA cnmem是一个 帮助深度学习框架管理 CUDA 内存的简单库 据报道 CNMeM 提供了一些有趣的速度改进 https datascience stackexchan
  • 如何提取图像中的表格

    我想从图像中提取表格 这个 python 模块https pypi org project ExtractTable https pypi org project ExtractTable 与他们的网站https www extractta
  • MD5 和 SHA1 的安全性如何

    嘿 只是一个简单的问题 因为我想更多地了解哈希函数 我知道它们如何工作以及它们做什么 但是它们的安全性如何 我希望得到一个简单的答案而不是链接 因为我从来没有发现它们有用 现在的技术 两者都可以cracked http www hackth
  • 如何在Spring中模拟ModelMapper?

    我正在尝试为我的服务层编写单元测试 SpringBootTest class ClinicServiceTest Mock private ProcedureRepository procedureRepository InjectMock
  • 一键切换两个复选框,无需js

    有没有办法切换两个combined一键点击复选框 我有一个小日历 我想用复选框选择几周 一周可以是两个月 所以同一周我有两个复选框 我怎样才能安全地将它们结合起来 我正在使用这个抽象 HTML
  • EOF 符号常量

    From C 编程语言 int c while c getchar EOF putchar c 解决办法是getchar当没有更多输入时 返回一个独特的值 该值不能与任何真实字符混淆 这个值称为EOF 表示 文件结束 我们必须声明c是一个足
  • gulp + 浏览器同步无法获取/错误

    我正在学习当前的前端构建系统 我想使用浏览器同步 问题是它不会在命令行中抛出错误 而是当它启动浏览器时 它不会显示我的html文件 并且它会在浏览器窗口中显示 无法获取 错误 这是我的 gulpfile js 代码 var gulp req
  • 电话链接在 iframe 中不起作用,但在 iOS 9 Web 中的 div 中起作用。如何使电话链接在 iOS 9 safari 中正常工作?

    您好 我正在尝试 iOS9 中 iframe 内的电话链接 iOS9 中的 safari 中无法打开手机应用程序 当我在里面尝试相同的链接时 它就在那里工作 我正在尝试下面的锚标记 将此代码放入 div 中时会打开手机应用程序 但同样的代码
  • 使用 元素通过 Wix 运行 SQL 脚本文件

    我是 Wix 安装程序的新手 我有一个要求 必须提供 SQL Server 登录凭据并从特定路径运行脚本 我不明白出了什么问题 项目已成功构建并创建了 msi 运行后我收到以下错误 错误26204 错误 2147217900 无法执行SQL
  • 如何在SAS中删除重复的记录\观察而不进行排序?

    我想知道是否有办法取消重复记录WITHOUT排序 有时候 我想保留原来的顺序 只想删除重复的记录 是否可以 顺便说一句 以下是我对不重复记录的了解 它最终会进行排序 1 proc sql create table yourdata nodu
  • JavaScript:异常排序

    假设我有一个对象数组 为了更简单的显示目的 我将其显示为数组 TEST NEW ALPHA ZOO WHATEVER 我需要按字母顺序对其进行排序 简单的部分 但是 我需要以某种方式对其进行排序 即某个单词 可以说NEW将会在最后结束 AL
  • 如何通过调用 HTTP API 网关 + Lambda(已使用 Amazon Cognito 用户池进行身份验证)获取用户详细信息

    用户登录 Amazon Cognito 应用程序 Web 会获取一个 访问令牌 每当调用 API 网关 HTTP API 或 REST API 时都会使用该令牌 API 网关配置为使用 Cognito 用户池作为授权者 因此如果 访问令牌