为iOS创建用户身份验证系统(之前使用Parse,希望是AWS)

cdu*_*dub 6 authentication objective-c amazon-web-services ios parse-platform

由于Parse正在消失,我最初使用他们的_User和PFUser实现来创建用户身份验证过程.

我已经开始转向亚马逊的AWS Mobilie Hub.我在Amazon Cognito系统中注意到它们允许谷歌,Facebook,亚马逊凭证提供商,我还不想使用它们.

我去看看自定义提供商的选择.我是否必须使用客户端和服务器端代码创建自己的后端身份验证系统才能使用此功能?

像Parse这样的iOS有一个简单的方法(但是安全)登录过程吗?

谢谢,任何帮助将不胜感激(在网上阅读了很多).

iSk*_*ore 8

是的,我一直使用AWS自定义身份验证.

检查一下,我在这里发布了另一个自定义身份验证的答案

所以步骤是:

  1. 设置Cognito以验证未经过身份验证的用户
    • 您必须这样做,否则登录他们将无法访问任何内容. 未经身份验证的用户

和您的真实用户开发者名称 < - 重要部分

开发者名称

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

  2. 转到IAM并发挥AUTHENTICATED作用和UNAUTHENTICATED角色.

  3. 你赋予UNAUTHENTICATED角色,分配:

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

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"
            }
        }
    }]
}
Run Code Online (Sandbox Code Playgroud)
  1. 现在让你的AUTHENTICATED角色,并分配:

    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"
            }
        }
    }]
}
Run Code Online (Sandbox Code Playgroud)

请注意一次改变 - "认证"和"未经认证"

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

  2. 现在您已完成所有设置,从Mobile Hub启动您的xcode项目

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

  4. 设置登录页面

  5. 当用户登录时(加密他们的密码)并将其和用户名发送到DynamoDB.

12B.我非常喜欢将Lambda特别用于移动设备,因为你可以做得更多而且你不容易出错并且你有更多的控制权等等.

因此,随着中说,回到步骤4和6,如果你想使用Lambda和添加和Inline PolicyRoles.IAM - >角色 - >你的角色 - > Create Role Policy 并弹出:

{
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "Service": "lambda.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
    }]
}
Run Code Online (Sandbox Code Playgroud)

现在你已经设置了基础,回到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');
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

一旦你获得了data.Items回到Xcode,调用这个Lambda函数,发送你的变量,当他们说"好"时,调用:

credentialsProvider.setLogins({developerAuthenticationProvider.getProviderName(), developerUserIdentifier});
Run Code Online (Sandbox Code Playgroud)

其次是 credentialsProvider.refresh();

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

现在,事情变得奇怪了.有很多方法可以做到这一点.TVM,Cognito Assume Auth,服务器端等.

我总是再假定从认证UnauthenticatedAuthenticated,但你必须做大量的后端的东西,如果你想,如果你正在做这两个获得来自网页端和移动端实时分析.但是,一旦您拥有经过身份验证的用户,您现在拥有经过良好身份验证的用户,随时可以访问您在步骤6中列出的经过身份验证的任何内容!

希望这可以帮助.

更新---这是一个肮脏,不安全但快速的方法.不适合生产.

在认知中,甚至不做Authenticated user role.给你的Unauthenticated user role所有的权限做的一切(DynamoDBFullAccess,S3FullAccess,EC2FullAccess等)

然后在手机中处理您的身份验证 - 检查DynamoDB的用户名和密码,然后如果它返回信息,请将变量设置为TRUE.这是不安全的,因为用户现在可以访问您的所有内容,但它看起来像这样:

BOOL loggedIn = FALSE;
if (loggedIn) {
    [self loadView];
} else {
    [self loadLoginView];
}

- (void) loadLoginView {
    DynamoDBCall (username, password) withCompletion () {
        if (allGood) {
            _loggedIn = TRUE;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)