nak*_*tic 5 javascript amazon-web-services node.js amazon-cognito aws-lambda
我担心AWS Cognito用户池Javascript API似乎并不关心哪些网站请求来自(您需要使用API的是用户池ID和客户端ID,这些都可以在我的javascript源代码中找到) ).
我是否有理由担心另一个网站可能会劫持我的用户池,可能会欺骗用户注册它?
如果这是一个有效的问题,有什么办法可以防止这种情况吗?预认证Lambda有效负载似乎不包含任何请求源数据,所以我想这不是这样做的方法.
如果不是我需要关注的事情,那为什么呢?
所以,我仔细考虑了这个问题并决定:
是的,在你的前端有这些数字是可以的。
当然——原因很多如下。
题:
我是否担心另一个站点可能会劫持我的用户池,从而诱骗用户注册?
回复:
如果我把你的
UserPoolID和ClientID- 我可以“劫持”到你的应用程序吗?
回答:
不完全是......也许有点,但为什么......
您给予客户的“租赁”或“许可”级别完全取决于您和您的 IAM 角色。可以说我们不考虑我的第二个也是更相关的原因 - (来源检查)。
如果我窃取了您的访问密钥并滥用了您的应用程序/品牌/任何东西,我只是在将客户吸引到您的网站。如果您将经过身份验证的用户权限设置为不允许,我将无法访问您的客户列表、数据、日志、记录等。锁定您对客户列表、池信息、数据等的“管理员级别”权限。
示例(添加到您的Statement部分):
{
"Effect": "Deny",
"Action": [
"cognito-identity:CreateIdentityPool",
"cognito-identity:DeleteIdentityPool",
"cognito-identity:DeleteIdentities",
"cognito-identity:DescribeIdentity",
"cognito-identity:DescribeIdentityPool",
"cognito-identity:GetIdentityPoolRoles",
"cognito-identity:ListIdentities",
"cognito-identity:ListIdentityPools",
"cognito-identity:LookupDeveloperIdentity",
"cognito-identity:MergeDeveloperIdentities",
"cognito-identity:SetIdentityPoolRoles",
"cognito-identity:UnlinkDeveloperIdentity",
"cognito-identity:UpdateIdentityPool"
],
"Resource": [
"arn:aws:cognito-identity:us-east-1:ACCOUNT_DIGITS:identitypool/us-east-1:PoolID_NUMBERS"
]
}
Run Code Online (Sandbox Code Playgroud)
或者干脆相反:
{
"Effect": "Allow",
"Action": [
"cognito-identity:GetOpenIdTokenForDeveloperIdentity"
],
"Resource": "arn:aws:cognito-identity:us-east-1:ACCOUNT_DIGITS:identitypool/us-east-1:NUMBERS-NUMBERS-PoolID"
}
Run Code Online (Sandbox Code Playgroud)
只需要那"cognito-identity:GetOpenIdTokenForDeveloperIdentity"部分。锁定您的“用户级别”权限
例子:
{
"Effect": "Allow",
"Action": [ "s3:PutObject", "s3:GetObject" ],
"Resource": [
"arn:aws:s3:::[bucket]/[folder]/${cognito-identity.amazonaws.com:sub}/*"
]
}
Run Code Online (Sandbox Code Playgroud)
作为一个明显的经验法则 - 只给用户他们需要的权限。锁定所有可能锁定的废话并使用策略模拟器。结论一:
您可以锁定所有会暴露您的客户群的事情,并使某人“劫持”您的网站变得毫无意义。相反的观点:
是的,但是如果
题:
预身份验证 Lambda 负载似乎不包含任何请求源数据,所以我想这不是这样做的方法。
回复:
唔。
回答:
是的,它确实包含请求源数据 -如果设置了它。
题:
我担心 AWS Cognito 用户池 Javascript API 似乎并不关心来自哪个网站的请求
回答:
为此 - 你是对的。如果您使用带有用户池触发器的静态服务文件 - 几乎不需要检查来源。
所以 - 如果你真的想要 - 你可以使用 API Gateway to Lambda 来设置所有这些。这将从客户端删除与用户池的直接交互并将其放在后端。
前言:
设置设置:
const
AWS = require( 'aws-sdk' ),
UserPool = new AWS.CognitoIdentityServiceProvider();
exports.handler = ( event, context, callback ) => {
console.log( event );
const params = {
AuthFlow: 'CUSTOM_AUTH',
ClientId: 'numbers',
AuthParameters: {
USERNAME: event.email,
PASSWORD: event.password
}
};
UserPool.initiateAuth( params, ( err, data ) => {
callback( err, data );
} );
};
Run Code Online (Sandbox Code Playgroud)
在上面 - 是的,你可以这样做:
UserPool.initiateAuth( params, callback );
Run Code Online (Sandbox Code Playgroud)
代替:
UserPool.initiateAuth( params, ( err, data ) => {
callback( err, data );
} );
Run Code Online (Sandbox Code Playgroud)
但这会引发奇怪的错误 - 在 GitHub 上已经有一个关于它的问题。
Integration RequestBody Mapping Templatesapplication/json这是Apache Template Velocity Language-JSONScheme与其他映射模板事物使用的语言不同:
#set($allParams = $input.params())
{
"body-json" : $input.json('$'),
"params" : {
#foreach($type in $allParams.keySet())
#set($params = $allParams.get($type))
"$type" : {
#foreach($paramName in $params.keySet())
"$paramName" : "$util.escapeJavaScript($params.get($paramName))"
#if($foreach.hasNext),#end
#end
}
#if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
#if($foreach.hasNext),#end
#end
},
"context" : {
"account-id" : "$context.identity.accountId",
"api-id" : "$context.apiId",
"api-key" : "$context.identity.apiKey",
"authorizer-principal-id" : "$context.authorizer.principalId",
"caller" : "$context.identity.caller",
"cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
"cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
"cognito-identity-id" : "$context.identity.cognitoIdentityId",
"cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
"http-method" : "$context.httpMethod",
"stage" : "$context.stage",
"source-ip" : "$context.identity.sourceIp",
"user" : "$context.identity.user",
"user-agent" : "$context.identity.userAgent",
"user-arn" : "$context.identity.userArn",
"request-id" : "$context.requestId",
"resource-id" : "$context.resourceId",
"resource-path" : "$context.resourcePath"
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,您可以获取source-ip、认知信息等。
此方法是锁定源的安全方法。您可以通过检查ifLambda 或 IAM 条件来检查来源- 阻止来自其他来源的所有请求。
| 归档时间: |
|
| 查看次数: |
796 次 |
| 最近记录: |