6

由於Parse不在了,我最初使用他們的_User和PFUser實現來創建用戶認證過程。爲iOS創建一個用戶認證系統(以前用Parse希望AWS)

我已經開始轉向亞馬遜的AWS Mobilie Hub。我在亞馬遜Cognito系統中注意到他們允許Google,Facebook,Amazon憑證供應商,我不想使用它。

我去看看自定義供應商的選擇。我是否必須使用客戶端和服務器端代碼創建自己的後端驗證系統才能正常工作?

有沒有像Parse一樣的簡單方式(但安全)的iOS登錄過程?

謝謝,任何幫助將不勝感激(在線閱讀很多)。

+0

這是相當廣泛,但希望的答案幫助 - 問題應該更專注於你確切的問題有。不是「我該如何做到這一點」 - 更多「爲什麼這個代碼不起作用」 – iSkore

回答

8

是的,我一直使用AWS自定義身份驗證。

​​和另一answer I posted for custom authentication here

因此,步驟是:

  1. 設置Cognito到UNanthenticated用戶
    • 驗證你必須以其他方式做到這一點,他們將無法訪問任何之前登錄。 unauthenticated user

和你的真實用戶的開發者名稱 < - 重要組成部分

developer name

  • 設置DynamoDB(或其他)來存儲您的用戶名 - 密碼信息

  • 轉到IAM並創建AUTHENTICATED角色和UNAUTHENTICATED角色。

  • 你給UNAUTHENTICATED角色,分配:

    AmazonCognitoDeveloperAuthenticatedIdentities AmazonDynamoDBFullAccess(如果你想有一個登錄&註冊系統) AmazonDynamoDBReadOnlyAccess(如果你只是想登錄)

  • IAM roles

    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" 
          } 
         } 
        }] 
    } 
    
  • 現在使你的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

  • 現在,你擁有了一切成立,開始你的Xcode項目形式的移動集線器

  • 中的所有數據填寫(如果它不存在,這應該是因爲移動設備的集線器是您AUTHENTICATED ARN和你UNATHENTICATED ARN

  • 設置你的登錄頁面

  • 高興我們)當用戶去登錄,(加密他們的密碼),併發送和用戶名DynamoDB。

  • 12B。我真的很喜歡使用Lambda作爲手機,因爲你可以做更多的事情,而且你不太容易出錯,並且你有更多的控制權,等等。

    所以說回到第4步& 6如果你想要使用Lambda並將Inline Policy添加到Roles。 IAM - >角色 - >您的角色 - >Create Role Policy 和POP在:

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

    現在你有基本建立,回去的Xcode。

    如果您正在使用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函數,發送您的變量,當他們說 「好」,稱:

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

    其次credentialsProvider.refresh();

    上面這部分應該是從MobileHub Xcode項目。

    現在,這是事情變得怪異。有很多方法可以做到這一點。 TVM,Cognito假設驗證,服務器端等

    我總是重新擔負認證從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; 
         } 
        } 
    } 
    
    +0

    真棒這是更多我正在尋找。所以這一切都在AWS和我的Xcode iOS項目上是正確的? – cdub

    +0

    這是什麼意思* this *。只是想更好地瞭解 – iSkore

    +0

    哦,你的意思是「這個」以及所有這些步驟?正確的是,沒有必要像Parse或類似的其他方。 **儘管**,建議您提供Google,Facebook和亞馬遜登錄選項的選項 – iSkore