限制AWS Cognito用户池javascript api的请求源
我担心AWS Cognito用户池Javascript API似乎并不关心哪些网站请求来自(您需要使用的所有API都是用户池ID和客户端ID,这些将在我的javascript源代码中随时可用)。
我有权担心另一个网站可能会劫持我的用户池,可能欺骗用户注册它吗?
如果这是一个有效的关注,有什么办法来防止这种情况? 预authenticationLambda有效负载似乎不包括任何请求源数据,所以我想这不是做到这一点的方法。
如果这不是我需要关心的,那为什么呢?
所以,我已经详细考虑了这个问题,并决定:
是的,可以在前端添加这些数字。
当然,原因如下。
第一 :
题:
我有权担心另一个网站可能会劫持我的用户池,可能欺骗用户注册吗?
响应:
如果我把你的
UserPoolID
和ClientID
– 我可以“劫持”你的应用程序?
回答:
不完全 …也许有点乱,但为什么 …
您给客户的“租赁”或“许可”级别完全取决于您和您的IAMangular色。 可以说,我们不考虑我的第二个和更多的相关原因,但(原产地检查) 。
如果我窃取您的访问密钥和滥用您的应用程序/品牌/无论如何,我只是驾驶客户到您的网站。 我无法访问您的客户列表,数据,日志,logging等如果您设置您的身份validation的用户权限不允许 。 将您的“pipe理员级别”权限locking到客户端列表,池信息,数据等
示例(添加到您的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" ] }
或者完全相反:
{ "Effect": "Allow", "Action": [ "cognito-identity:GetOpenIdTokenForDeveloperIdentity" ], "Resource": "arn:aws:cognito-identity:us-east-1:ACCOUNT_DIGITS:identitypool/us-east-1:NUMBERS-NUMBERS-PoolID" }
只需要"cognito-identity:GetOpenIdTokenForDeveloperIdentity"
部分。 locking你的“用户级别”权限的东西
例:
{ "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::[bucket]/[folder]/${cognito-identity.amazonaws.com:sub}/*" ] }
作为一个明显的经验法则 – 只给予用户许可他们需要的东西。 locking所有的垃圾,你可以locking,并使用政策模拟器。 结论来推理一:
你可以locking所有可能会暴露你的客户群的东西,并让别人“无意”你的网站。 相反的观点:
雅,但如果
这里是一个文件,可能有助于IAM的东西 等等
第二 :
题:
预authenticationLambda有效负载似乎不包含任何请求源数据,所以我想这不是做到这一点的方法。
响应:
嗯。
回答:
是的,它确实包括请求原始数据 – 如果有人设置它。
题:
我担心AWS Cognito用户池JavaScript API似乎不关心哪些网站请求来自哪里
回答:
为此 – 你是对的。 如果您正在使用带有用户池触发器的静态服务文件,则检查原点的操作很less。
所以 – 如果您真的想 – 您可以使用API Gateway to Lambda设置所有这些。 这将从客户端删除与用户池的直接交互,并将其放在后端。
前言:
设置为设置:
- 进入用户池并设置一个池
- 添加一个authenticationidetity池
- 进入Lambda并使用API网关触发器事件挂接一个函数
- 放入你的代码 – 这是一个“login”的例子:
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 ); } ); };
在上面 – 是的,你可以这样做:
UserPool.initiateAuth( params, callback );
代替:
UserPool.initiateAuth( params, ( err, data ) => { callback( err, data ); } );
但是这会引发奇怪的错误 – 在GitHub上已经有一个关于它的问题了。
- 从API网关转到触发器事件
- 点击你的方法,进入
Integration Request
部分 - 在底部,您会看到“
Body Mapping Templates
- 添加一个新的,并在
application/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" } }
有了这个,你可以得到source-ip
,认知信息等。
此方法是locking原点的安全方法。 您可以通过在Lambda中进行检查或IAM条件来检查来源 – 阻止来自其他来源的所有请求。