- 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/
我有一个支持 Cognito 未验证身份的 JavaScript Web 应用程序。我正在尝试找出如何为 DISABLED 未经身份验证的 IdentityId 识别链接的经过身份验证的 Identi
首先,我已经阅读了类似的问题: Using AWS Cognito can I resolve the authenticated IdentityId given a disabled unauth
我正在尝试为我刚刚创建的用户获取 AWS 凭证。 谁能告诉我identityId应该是?我尝试将区域与用户 sub 连接,但它没有: var params = { UserPoolId: proc
我很高兴在我的预发布应用程序 (iOS/Objective-C) 中使用 Cognito Sync,并登录 Facebook。然而,在提交苹果应用商店审核后,我被要求删除 Facebook 登录信息。
我在 AWS Lambda 函数中使用以下 node.js 代码,根据另一个名为 Submissions 的表中的源数据插入或更新名为 StoryEntity 的 DynamoDB 表中的记录> 当
我正在尝试使用 Cognito 和开发人员验证身份来验证我的用户。我的问题是如何使用 objective-c 将 identityId 设置为从我的 iOS 开发人员后端返回的正确身份? 如果我在代码
到目前为止,我已成功登录 Cognito 并同步数据,但一直无法退出用户。能够从身份提供者注销,但再次登录到 cognito 时,我收到无效登录错误。当我重新加载应用程序时,虽然它可以工作。 最佳答案
我正在使用 AWS Congito 用户池通过 Cognito 身份池进行账户管理,该身份池将此用户池作为身份提供者。我使用它来控制通过 API 网关对 API 的访问,该网关将请求发送到 Lambd
在我的 Web 应用程序中,我希望允许用户使用 2 个可能的提供商(Facebook、Google)登录并使用 AWS Cognito 检索凭证。 据我了解,如果用户 (john@domain.com
我有一个应用程序通过 AWS Cognito 使用 Facebook 提供商成功登录。登录后直接使用该应用程序可以检索身份,一切似乎都运行良好。 但是,经过一段时间(大约 > 1 小时)后,当返回应用
好的,我现在已经进入了这几天并且已经取得了重大进展,但仍然完全被基本面难住了。 我的应用程序使用 Cognito 用户池来创建和管理用户 - 这些在 S3 上通过他们的 IdentityId 进行标识
我是一名优秀的程序员,十分优秀!