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

时间:2016-02-01 17:27:08

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

所以步骤是:

  1. 设置Cognito以对经过身份验证的用户进行身份验证
    • 您必须这样做,否则他们无法在登录前访问任何unauthenticated user
  2. 和您的真实用户开发者名称< - 重要部分

    developer name

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

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

    3. 您提供UNAUTHENTICATED角色,指定:

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

    4. IAM roles

      1. 也进去做:
      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": "unauthenticated"
                    }
                }
            }]
        }
        
        1. 现在成为AUTHENTICATED角色,并指定:

          AmazonCognitoPowerUser AmazonDynamoDBFullAccess AmazonSNSFullAccess - 例如,以及您喜欢的任何其他内容

        2. 也进去做:

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

          请注意一次改变 - &#34;认证&#34;和&#34;未经认证的&#34;

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

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

          3. AUTHENTICATED ARNUNATHENTICATED ARN

            填写所有数据(如果不存在,那应该是因为Mobile-Hub对我们很好) LI>
          4. 设置登录页面

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

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

            所以说,回到第4步&amp; 6如果您想使用Lambda并将Inline Policy添加到Roles。 IAM - &gt;角色 - &gt;你的角色 - &gt; Create Role Policy 然后弹出:

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

            现在你已经设置了基础,回到Xcode。

            1. 如果您使用的是Lambda,请输入您的用户名和密码,让lambda从DynamoDB中提取行并对does the user exist, if so do the passwords match进行检查
            2. 在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函数,发送你的变量,当他们说&#34; good&#34;时,调用:

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

              后跟credentialsProvider.refresh();

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

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

              我总是重新认证从UnauthenticatedAuthenticated的身份验证,但是如果你想从网络端和移动端获得真正的分析,你必须做很多后端工作。为两者做这个。但是,一旦您拥有经过身份验证的用户,您现在拥有经过良好身份验证的用户,随时可以访问您在步骤6中列出的经过身份验证的任何内容!

              希望这有帮助。

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

              在认知中,甚至不能制作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;
                      }
                  }
              }