为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的答案
所以步骤是:
- 设置Cognito以validationUNanthenticated用户
- 你必须这样做,否则他们将无法login之前访问任何东西。
和您的真实用户开发人员名称 < – 重要部分
-
设置DynamoDB(或其他)来存储您的用户名 – 密码信息
-
去IAM并且做一个
AUTHENTICATED
angular色和一个UNAUTHENTICATED
angular色。 -
你给了
UNAUTHENTICATED
angular色,分配:AmazonCognitoDeveloperAuthenticatedIdentities AmazonDynamoDBFullAccess(如果您想要login和注册系统)AmazonDynamoDBReadOnlyAccess(如果您只想login)
- 还要进去做:
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" } } }] }
-
现在让你的
AUTHENTICATED
angular色,并分配:AmazonCognitoPowerUser AmazonDynamoDBFullAccess AmazonSNSFullAccess – 例如,以及任何你想要的东西
-
还要进去做:
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”
-
现在这应该是移动中心的责任,但是自从他们出来之后,所有人都认为他们已经免除了责任! 不是这样! 你需要知道什么
sts:AssumeRoleWithWebIdentity
-
现在你已经设置了一切,从Mobile Hub开始你的xcode项目
-
填写所有的数据(如果它不在,那应该是因为Mobile-Hub对我们很好),为你的
AUTHENTICATED ARN
和你的UNATHENTICATED ARN
-
设置您的login页面
-
当用户login时,(encryption他们的密码)并将其和用户名发送到DynamoDB。
12B。 我真的很喜欢使用Lambda作为手机,因为你可以做更多的事情,而且你不太容易出错,而且你有更多的控制权。
所以说,回到步骤4和6如果你想使用Lambda并添加和Inline Policy
的Roles
。 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。
- 如果您使用的是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从Unauthenticated
到Authenticated
,但是如果你想从networking端和移动端获得真正的分析,你必须做很多后端的东西。 但是,一旦你有了你的authentication用户,你现在已经有了一个authentication好的用户,随时可以访问你在步骤6中列出的authentication!
希望这可以帮助。
更新—这是一个肮脏,不安全,但快速的方式来做到这一点。 不为生产。
在cognito中,甚至不要进行Authenticated user role
。 为您的Unauthenticated user role
所有操作的所有权限( DynamoDBFullAccess
, S3FullAccess
, EC2FullAccess
等)
然后在电话中处理您的身份validation – 根据DynamoDB检查用户名和密码,然后如果它返回信息,请将variables设置为TRUE
。 这是不安全的,因为用户现在可以访问所有的东西,但看起来像这样:
BOOL loggedIn = FALSE; if (loggedIn) { [self loadView]; } else { [self loadLoginView]; } - (void) loadLoginView { DynamoDBCall (username, password) withCompletion () { if (allGood) { _loggedIn = TRUE; } } }