为iOS创build一个用户authentication系统(以前用Parse希望AWS)

由于Parse正在消失,我最初使用_User和PFUser实现来创build用户身份validation过程。

自此我开始转向亚马逊的AWS Mobilie Hub。 我在Amazon Cognito系统中注意到,他们允许Google,Facebook,Amazon凭证供应商,我不想使用它。

我去看看自定义供应商的select。 我必须创build一个客户端和服务器端代码的自己的后端身份validation系统才能正常工作吗?

是否有一个简单的方式(但安全)像iOS Parse的iOSlogin过程?

谢谢,任何帮助将不胜感激(在线阅读了很多)。

是的,我一直使用AWS自定义身份validation。

检查了这一点,并在这里发布的另一个自定义authentication的答案

所以步骤是:

  1. 设置Cognito以validationUNanthenticated用户
    • 你必须这样做,否则他们将无法login之前访问任何东西。 未经认证的用户

和您的真实用户开发人员名称 < – 重要部分

开发者名字

  1. 设置DynamoDB(或其他)来存储您的用户名 – 密码信息

  2. 去IAM并且做一个AUTHENTICATEDangular色和一个UNAUTHENTICATEDangular色。

  3. 你给了UNAUTHENTICATEDangular色,分配:

    AmazonCognitoDeveloperAuthenticatedIdentities AmazonDynamoDBFullAccess(如果您想要login和注册系统)AmazonDynamoDBReadOnlyAccess(如果您只想login)

IAM角色

  1. 还要进去做:

Edit Trust Relationship

 { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "<YOUR_COG_ARN>" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } } }] } 
  1. 现在让你的AUTHENTICATEDangular色,并分配:

    AmazonCognitoPowerUser AmazonDynamoDBFullAccess AmazonSNSFullAccess – 例如,以及任何你想要的东西

  2. 还要进去做:

Edit Trust Relationship

 { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "<YOUR_COG_ARN>" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } }] } 

请注意一个更改 – “authentication”和“未authentication”

  1. 现在这应该是移动中心的责任,但是自从他们出来之后,所有人都认为他们已经免除了责任! 不是这样! 你需要知道什么sts:AssumeRoleWithWebIdentity

  2. 现在你已经设置了一切,从Mobile Hub开始你的xcode项目

  3. 填写所有的数据(如果它不在,那应该是因为Mobile-Hub对我们很好),为你的AUTHENTICATED ARN和你的UNATHENTICATED ARN

  4. 设置您的login页面

  5. 当用户login时,(encryption他们的密码)并将其和用户名发送到DynamoDB。

12B。 我真的很喜欢使用Lambda作为手机,因为你可以做更多的事情,而且你不太容易出错,而且你有更多的控制权。

所以说,回到步骤4和6如果你想使用Lambda并添加和Inline PolicyRoles 。 IAM – >angular色 – >您的angular色 – > Create Role Policy并popup:

 { "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" }] } 

现在你已经build立了基础,回到Xcode。

  1. 如果您使用的是Lambda,请发送您的用户名和密码,让lambda从DynamoDB中提取该行,并检查does the user exist, if so do the passwords match

在Lambda中应该看起来像这样:

 const AWS = require('aws-sdk'), ddb = new AWS.DynamoDB() exports.handler = function(event, context) { var params = { TableName : '<users>', KeyConditionExpression : 'userType = :v_type AND username = :v_user', FilterExpression : 'password = :v_pass', ExpressionAttributeValues : { ':v_type' : { S : '<superdooper>' }, ':v_user' : { S : event.username }, ':v_pass' : { S : event.password } } //ProjectionExpression: 'email, joinDate, phone' (OPTIONAL) } ddb.query (params, function(err, data) { if (err) { context.fail (JSON.stringify(err, null, 2)); } else { if (data.Count !== 0) context.succeed (data.Items); else context.succeed ('Wrong Info'); } }); }; 

一旦你得到你的data.Items在Xcode中,调用这个Lambda函数,发送你的variables,当他们说“好”,调用:

 credentialsProvider.setLogins({developerAuthenticationProvider.getProviderName(), developerUserIdentifier}); 

其次是credentialsProvider.refresh();

上面的那部分应该在MobileHub的Xcode项目中。

现在,这是事情变得怪异。 有很多方法可以做到这一点。 TVM ,Cognito假设authentication,服务器端等。

我总是重新authentication从UnauthenticatedAuthenticated ,但是如果你想从networking端和移动端获得真正的分析,你必须做很多后端的东西。 但是,一旦你有了你的authentication用户,你现在已经有了一个authentication好的用户,随时可以访问你在步骤6中列出的authentication!

希望这可以帮助。

更新—这是一个肮脏,不安全,但快速的方式来做到这一点。 不为生产。

在cognito中,甚至不要进行Authenticated user role 。 为您的Unauthenticated user role所有操作的所有权限( DynamoDBFullAccessS3FullAccessEC2FullAccess等)

然后在电话中处理您的身份validation – 根据DynamoDB检查用户名和密码,然后如果它返回信息,请将variables设置为TRUE 。 这是不安全的,因为用户现在可以访问所有的东西,但看起来像这样:

 BOOL loggedIn = FALSE; if (loggedIn) { [self loadView]; } else { [self loadLoginView]; } - (void) loadLoginView { DynamoDBCall (username, password) withCompletion () { if (allGood) { _loggedIn = TRUE; } } }