ios - 为 iOS 创建用户身份验证系统(以前使用 Parse 希望 AWS)

标签 ios objective-c authentication amazon-web-services parse-platform

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




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

从那以后,我开始改用亚马逊的 AWS Mobilie Hub。我确实在 Amazon Cognito 系统中注意到它们允许 Google、Facebook、Amazon 凭据提供程序,但我还不想使用它们。

我去看看自定义提供程序的选择。我是否必须使用客户端和服务器端代码创建自己的后端身份验证系统才能正常工作?

有没有像 Parse 那样的简单(但安全)的 iOS 登录过程?

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

最佳答案

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

Check this out和另一个 answer I posted for custom authentication here

所以步骤是:

  • 设置 Cognito 以对未经身份验证的用户进行身份验证
  • 您必须这样做,否则他们将无法在登录前访问任何内容。
    unauthenticated user

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

    developer name
  • 设置 DynamoDB(或其他)来存储您的用户名-密码信息
  • 转到 IAM 并创建一个 AUTHENTICATED角色和 UNAUTHENTICATED角色。
  • 你给 UNAUTHENTICATED角色,分配:

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

  • IAM roles
  • 也进去做:
  • 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角色,并分配:

    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"
                }
            }
        }]
    }
    

    PLEASE NOTICE THE ONE CHANGE MADE - "authenticated" and "unauthenticated"


  • 现在这应该是移动集线器的责任,但既然他们提出了,每个人都认为他们免除了责任!不是这样!您需要知道什么sts:AssumeRoleWithWebIdentity
  • 现在您已完成所有设置,从 Mobile Hub
  • 开始您的 xcode 项目
  • 为您的 AUTHENTICATED ARN 填写所有数据(如果没有,应该填写,因为 Mobile-Hub 对我们很好)和您的 UNATHENTICATED ARN
  • 设置您的登录页面
  • 当用户登录时,(加密他们的密码)并将其和用户名发送到 DynamoDB。

  • 12B.我真的很喜欢在移动设备上使用 Lambda,因为你真的可以做更多的事情,而且你不太容易出错,而且你有更多的控制权等。

    因此,如果您想使用 Lambda 并添加和 Inline Policy,请返回第 4 步和第 6 步。到 Roles . IAM -> 角色 -> 你的角色 -> Create Role Policy并弹出:
    {
        "Version": "2012-10-17",
        "Statement": [{
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }]
    }
    

    现在您已经完成了基本设置,请返回 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');
            }
        });
    };
    

    在 Xcode 中获取 data.Items 后,调用此 Lambda 函数,发送变量,当它们说“好”时,调用:
    credentialsProvider.setLogins({developerAuthenticationProvider.getProviderName(), developerUserIdentifier});
    

    后跟 credentialsProvider.refresh();
    上面的那部分应该在您来自 MobileHub 的 Xcode 项目中。

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

    我总是从 Unauthenticated 重新接受身份验证至 Authenticated ,但是如果你想从 Web 端和移动端获得真正的分析,你必须做很多后端的事情,如果你要为两者做这件事。但是,一旦您拥有经过身份验证的用户,您现在就有了一个经过良好身份验证的用户,可以随时访问您在第 6 步中列出的任何经过身份验证的内容!

    希望这可以帮助。

    更新 --- 这是一种肮脏、不安全但快速的方法。不用于生产。

    在 cognito 中,甚至不要创建 Authenticated user role .给您的 Unauthenticated user role执行所有操作的所有权限( DynamoDBFullAccessS3FullAccessEC2FullAccess 等)

    然后在手机中处理您的身份验证 - 根据 DynamoDB 检查用户名和密码,然后如果它返回信息,将变量设置为 TRUE .这并不安全,因为用户现在可以访问您的所有内容,但它看起来像这样:
    BOOL loggedIn = FALSE;
    if (loggedIn) {
        [self loadView];
    } else {
        [self loadLoginView];
    }
    
    - (void) loadLoginView {
        DynamoDBCall (username, password) withCompletion () {
            if (allGood) {
                _loggedIn = TRUE;
            }
        }
    }
    

    关于ios - 为 iOS 创建用户身份验证系统(以前使用 Parse 希望 AWS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136637/

    相关文章:

    ios - 记住我使用 UISwitch 和 NSUserDefaults ios 的功能

    objective-c - 为什么当在 UITextField 中点击清除按钮时,应用程序仅在 iOS 10 上挂起?

    ios - 使用 NSASCIIStringEncoding 对 NSString 进行编码

    jquery - 使用 JQuery 捕获密码输入类型的值

    c++ - 支持 iOS CoreMIDI 的跨平台 MIDI 库

    ios - 如何从 32 位和 64 位的 slider 中提取值?

    ios - 分组静态表后台问题

    ios - 如何在 Spotify 登录时处理 Facebook 的两步验证?

    python - django-allauth 在出错时重定向到自定义页面

    c# - 自定义身份验证 OpenRasta