限制AWS Cognito用户池javascript api的请求源

我担心AWS Cognito用户池Javascript API似乎并不关心哪些网站请求来自(您需要使用的所有API都是用户池ID和客户端ID,这些将在我的javascript源代码中随时可用)。

我有权担心另一个网站可能会劫持我的用户池,可能欺骗用户注册它吗?

如果这是一个有效的关注,有什么办法来防止这种情况? 预authenticationLambda有效负载似乎不包括任何请求源数据,所以我想这不是做到这一点的方法。

如果这不是我需要关心的,那为什么呢?

所以,我已经详细考虑了这个问题,并决定:

是的,可以在前端添加这些数字。

当然,原因如下。

第一

题:

我有权担心另一个网站可能会劫持我的用户池,可能欺骗用户注册吗?

响应:

如果我把你的UserPoolIDClientID – 我可以“劫持”你的应用程序?

回答:

完全 …也许有点乱,但为什么

您给客户的“租赁”或“许可”级别完全取决于您和您的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设置所有这些。 这将从客户端删除与用户池的直接交互,并将其放在后端。

前言:

设置为设置:

  1. 进入用户池并设置一个池
  2. 添加一个authenticationidetity池
  3. 进入Lambda并使用API​​网关触发器事件挂接一个函数
  4. 放入你的代码 – 这是一个“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上已经有一个关于它的问题了。

  1. 从API网关转到触发器事件
  2. 点击你的方法,进入Integration Request部分
  3. 在底部,您会看到“ Body Mapping Templates
  4. 添加一个新的,并在application/json
  5. 你应该看到下面的示例模板:

这是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条件来检查来源 – 阻止来自其他来源的所有请求。