AWS Cognitoを使用して、iOS APP(Swift)でユーザーのサインアップとサインインを実装しています。
ユーザーがサインアップしたときに、cognitoユーザープールに既に作成されている指定されたユーザープールグループにユーザーを追加したいと思います。
以下の迅速なコードを試しましたが、うまくいかないようです。
サインアップ後、[addToGroup]ボタンを押して、[GroupA]という名前のユーザープールグループに参加します。
@IBAction func addToGroupButton(_ sender: Any) {
let request = AWSCognitoIdentityProviderAdminAddUserToGroupRequest()
request?.groupName = "GroupA"
request?.userPoolId = "ap-northeast-1_8H0k*****"
request?.username = eMailAdd
let identityProvider = AWSCognitoIdentityProvider()
identityProvider.adminAddUser(toGroup: request!).continueWith { (task) -> Any? in
DispatchQueue.main.async(execute: {
if let error = task.error {
print("\(error.localizedDescription)")
}
})
}
}
ユーザーがサインアップするのに問題はなく、ユーザーがサインアップした情報を確認できます。ただし、ユーザー名はGroupAに表示されません。
誰かが私のコードの何が問題になっているのか教えてもらえますか?ありがとうございました!!
AWSCognitoIdentityProviderErrorNotAuthorizedのようなエラーが発生すると思います。これは「admin」API呼び出しであるため、ここで提案されているように「開発者の資格情報が必要です」[0]。
このAPI呼び出しが最初に機能するかどうかをテストするために、資格情報をハードコーディングすることをお勧めします
AWSStaticCredentialsProvider *credentialsProvider = [AWSStaticCredentialsProvider credentialsWithAccessKey:"your-access-key" secretKey:"your-secret-key"];
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
実稼働環境で資格情報をハードコーディングしないでください。
2019年7月21日更新:
let staticCredentialProvider = AWSStaticCredentialsProvider.init(accessKey: "yourAccessKey", secretKey: "yourSecretKey")
let configuration = AWSServiceConfiguration.init(region: .APSoutheast2, credentialsProvider: staticCredentialProvider)
AWSServiceManager.default()?.defaultServiceConfiguration = configuration
let request = AWSCognitoIdentityProviderAdminAddUserToGroupRequest()
request?.groupName = "GroupA"
request?.userPoolId = "ap-southeast-2_xxxxxxxxx"
request?.username = "yourUserName"
AWSCognitoIdentityProvider.default().adminAddUser(toGroup: request!).continueWith { (task) -> Any? in
DispatchQueue.main.async(execute: {
if let error = task.error {
print("\(error.localizedDescription)")
}
})
}
私はテストしました、上記のコードは私のテスト環境で機能しています。参考までにここにリストします。次のステップは、ハードコードされた資格情報をコードベースから削除しようとすることです。AWSStaticCredentialsProviderを使用する代わりに、CognitoIDプールを使用して一時認証情報を取得できます。私は十分な許可を得て、このフローは開発者の資格情報がなくても機能すると思います。
2019年7月26日更新:
// using Cognito userpool with identity pool, to provider credential to AWSServiceManager
let serviceConfiguration = AWSServiceConfiguration(region: .APSoutheast2, credentialsProvider: nil)
let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: "YourUserPoolClientId", clientSecret: "YourUserPoolClientSecret", poolId: "YourUserPoolId")
AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: "RandomStringForIdentifyingYourPoolWithinThisApp")
let pool = AWSCognitoIdentityUserPool(forKey: "RandomStringForIdentifyingYourPoolWithinThisApp")
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .APSoutheast2, identityPoolId: "YourIdentityPoolId", identityProviderManager:pool)
let configuration = AWSServiceConfiguration.init(region: .APSoutheast2, credentialsProvider: credentialsProvider)
AWSServiceManager.default()?.defaultServiceConfiguration = configuration
// sign in a user
pool.getUser("UserNameOfAUserInYourPool").getSession("UserNameOfAUserInYourPool", password: "PasswordOfAUserInYourPool", validationData: nil).continueWith { (task) -> Any? in
if let error = task.error {
print("user sign in error: \(error.localizedDescription)")
} else {
print("user session is: \(String(describing: task.result))")
}
// add a user to GroupA
let request = AWSCognitoIdentityProviderAdminAddUserToGroupRequest()
request?.groupName = "GroupA"
request?.userPoolId = "YourUserPoolId"
request?.username = "UserNameOfAUserInYourPool"
return AWSCognitoIdentityProvider.default().adminAddUser(toGroup: request!)
}.continueWith { (task) -> Any? in
if let error = task.error {
print("cannot add user to group \(error.localizedDescription)")
}
}
私が提案したように、これはハードコードされたAWS認証情報のないソリューションです。Cognito Identityプールは、ユーザーがCognitoユーザープール[3]にサインインした後、温度AWS認証情報を提供します。これにより、「adminAddToGroup」API呼び出しが有効になります。
上記のコードに加えて、AWSコンソールまたはAWSCLIを使用してCognitoIDプールをセットアップする必要もあります。詳細はスクリーンショットにあります。
また、認証されたユーザーが引き受ける認証IAMロールを作成する必要があります。これがポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"cognito-idp:AdminRemoveUserFromGroup",
"cognito-idp:AdminAddUserToGroup"
],
"Resource": "Your_userpool_ARN"
}
]
}
参照:[0] https://aws-amplify.github.io/aws-sdk-ios/docs/reference/Classes/AWSCognitoIdentityProvider.html#//api/name/adminAddUserToGroup:[2 ] https:// aws。 amazon.com/blogs/mobile/how-amazon-cognito-keeps-mobile-app-users-data-safe/ [3] https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito -integrating-user-pools-with-identity-pools.html
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加