- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我现在已经进入了这几天并且已经取得了重大进展,但仍然完全被基本面难住了。
我的应用程序使用 Cognito 用户池来创建和管理用户 - 这些在 S3 上通过他们的 IdentityId 进行标识。我的每个用户都有自己的 S3 文件夹,AWS 会自动为他们提供一个与用户的 IdentityId 相同的文件夹名称。
我需要将 IdentityId 与其他 Cognito 用户信息相关联,但无法弄清楚如何。
我需要的关键是能够识别给定 IdentityId 的用户名和其他认知用户属性 - 这非常困难。
因此,第一场战斗是弄清楚当 Cognito 用户通过 AWS API 网关发出请求时如何获取 IdentityId。最终我解决了这个问题,现在我有一个 Cognito 用户,他向 API 网关发出请求,而我背后的 Lambda 函数现在有了 IdentityId。那一点有效。
但是我完全不知道现在如何访问存储在用户池中的 Cognito 用户信息。我找不到任何明确的信息,当然也没有代码,显示如何使用 IdentityId 获取 Cognito 用户的属性、用户名等。
看来,如果我在 API Gateway 中使用“Cognito 用户池”来授权我的方法,那么可以使用正文映射模板将 Cognito 用户信息(例如 sub、用户名和电子邮件地址)放入上下文中,但我确实这样做了不获取 IdentityId。
但是如果我使用 AWS_IAM
在 API 网关中授权我的方法,然后正文映射模板执行相反的操作 - 它为我提供 IdentityId 但不提供 Cognito 用户字段,例如 sub 和 username 以及电子邮件。
这让我发疯 - 如何将 IdentityId 和所有 Cognito 用户字段和属性合并到一个数据结构中?我似乎只能得到一个或另一个的事实是没有意义的。
最佳答案
事实证明,要使用 AWS Lambda/Cognito/API Gateway 同时获取 IdentityId 和用户详细信息,您需要有一个使用 AWS_IAM
进行身份验证的 Lambda 函数。 (不是 COGNITO_USER_POOLS
),您必须将您的请求发送到 AWS API 网关,但它必须是签名请求,然后您必须修改集成请求正文映射模板,以便在事件中为您提供 IdentityId(可能是上下文?不记得了)。现在您有了 IdentityId。呼。现在您必须从前端向后端提交客户端的 Cognito ID token 。验证 token 很重要 - 如果您不验证它,您就不能相信它没有被篡改。要解码和验证 token ,您必须从用户池中获取 key ,将它们放入您的脚本中,确保您的 AWS lambda zipfile 中包含 jwt 解码库和签名验证库。现在您的脚本必须验证从前端提交的 token ,然后您可以从 token 中获取用户详细信息。瞧!现在您拥有 IdentityId 以及用户详细信息,例如他们的子、用户名和电子邮件地址。太简单。
以上是使用 AWS Cognito/Lambda/API Gateway 获取与 IdentityId 关联的用户名所需的操作。这花了我几天的时间才开始工作。
我可以对任何在此徘徊的亚马逊员工说吗......好吧,获取与 IdentityId 相关联的用户详细信息太难了。你需要解决这个问题。这让我很生气,这太难了,浪费了我太多的时间。
解决方案:
我通过在此处修改 Amazon 员工自定义授权器来做到这一点:
https://s3.amazonaws.com/cup-resources/cup_custom_authorizer_lambda_function_blueprint.zip
如在此处找到和描述的:
https://aws.amazon.com/blogs/mobile/integrating-amazon-cognito-user-pools-with-api-gateway/
use strict';
let util = require('util');
var jwt = require('jsonwebtoken');
var jwkToPem = require('jwk-to-pem');
var userPoolId = 'YOUR USERPOOL ID';
var region = 'YOUR REGION'; //e.g. us-east-1
var iss = 'https://cognito-idp.' + region + '.amazonaws.com/' + userPoolId;
//https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html
// DOWNLOAD FROM https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
let userPoolKeys = {PUT YOUR DOWNLOADED USER POOL KEYS JSON HERE};
var pems = {};
let convertKeysToPems = () => {
var keys = userPoolKeys['keys'];
for(var i = 0; i < keys.length; i++) {
//Convert each key to PEM
var key_id = keys[i].kid;
var modulus = keys[i].n;
var exponent = keys[i].e;
var key_type = keys[i].kty;
var jwk = { kty: key_type, n: modulus, e: exponent};
var pem = jwkToPem(jwk);
pems[key_id] = pem;
}
}
exports.handler = function(event, context) {
convertKeysToPems()
console.log(event);
let token = event['body-json'].cognitoUserToken;
console.log(event['body-json'].cognitoUserToken);
ValidateToken(pems, event, context, token);
};
let ValidateToken = (pems, event, context, token) => {
//Fail if the token is not jwt
var decodedJwt = jwt.decode(token, {complete: true});
console.log(decodedJwt)
if (!decodedJwt) {
console.log("Not a valid JWT token");
context.fail("Unauthorized");
return;
}
//Fail if token is not from your UserPool
if (decodedJwt.payload.iss != iss) {
console.log("invalid issuer");
context.fail("Unauthorized");
return;
}
//Reject the jwt if it's not an 'Access Token'
if (decodedJwt.payload.token_use != 'id') {
console.log("Not an id token");
context.fail("Unauthorized");
return;
}
//Get the kid from the token and retrieve corresponding PEM
var kid = decodedJwt.header.kid;
var pem = pems[kid];
if (!pem) {
console.log(pems, 'pems');
console.log(kid, 'kid');
console.log('Invalid token');
context.fail("Unauthorized");
return;
}
//Verify the signature of the JWT token to ensure it's really coming from your User Pool
jwt.verify(token, pem, { issuer: iss }, function(err, payload) {
if(err) {
context.fail("Unauthorized");
} else {
let x = decodedJwt.payload
x.identityId = context.identity.cognitoIdentityId
//let x = {'identityId': context['cognito-identity-id'], 'decodedJwt': decodedJwt}
console.log(x);
context.succeed(x);
}
});
}
关于aws-lambda - 带有 Cognito 的 AWS Lambda API 网关 - 如何使用 IdentityId 访问和更新 UserPool 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42386180/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!