AWS Cognitoを使用して、テスト目的でダミーユーザーを作成します。
次に、AWS Consoleを使用してこのようなユーザーを作成しますが、ユーザーのstatusはFORCE_CHANGE_PASSWORD
に設定されています。その値では、このユーザーは認証できません。
このステータスを変更する方法はありますか?
CLIからユーザーを作成するときの同じ動作
ご迷惑をおかけして申し訳ありません。ユーザーを作成して直接認証するだけのワンステッププロセスはありません。管理者がユーザーが直接使用できるパスワードを設定できるようにするなど、将来これを変更する可能性があります。現時点では、AdminCreateUser
を使用して、またはアプリでユーザーをサインアップしてユーザーを作成する場合、ログイン時にユーザーにパスワードの変更を強制するか、ユーザーにメールまたは電話番号を確認してステータスを変更させる追加の手順が必要ですユーザーのCONFIRMED
へ。
しばらく経ちましたが、この投稿に出くわした他の人に役立つかもしれないと思いました。
AWS CLIを使用してユーザーのパスワードを変更できますが、これは複数ステップのプロセスです。
ステップ1:目的のユーザーのセッショントークンを取得します。aws cognito-idp admin-initiate-auth --user-pool-id %USER POOL ID% --client-id %APP CLIENT ID% --auth-flow ADMIN_NO_SRP_AUTH --auth-parameters USERNAME=%USERS USERNAME%,PASSWORD=%USERS CURRENT PASSWORD%
「クライアントのシークレットハッシュを検証できません」というエラーが返された場合は、シークレットなしで別のアプリクライアントを作成し、そのクライアントIDを使用します。
ステップ2:ステップ1が成功すると、チャレンジ「NEW_PASSWORD_REQUIRED」、他のチャレンジパラメータ、およびユーザーセッションキーで応答します。次に、2番目のコマンドを実行して、チャレンジレスポンスを発行できます。aws cognito-idp admin-respond-to-auth-challenge --user-pool-id %USER POOL ID% --client-id %CLIENT ID% --challenge-name NEW_PASSWORD_REQUIRED --challenge-responses NEW_PASSWORD=%DESIRED PASSWORD%,USERNAME=%USERS USERNAME% --session %SESSION KEY FROM PREVIOUS COMMAND with ""%
「指定された無効な属性、XXXがありません」に関するエラーが発生した場合は、userAttributes。$ FIELD_NAME = $ VALUEの形式を使用して、欠落している属性を渡します。
上記のコマンドは、有効な認証結果と適切なトークンを返す必要があります。
これが機能するには、CognitoユーザープールにADMIN_NO_SRP_AUTH機能を設定したアプリクライアントが必要です。 (ステップ5に注意してください http://docs.aws.Amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html )
このユーザーステータスFORCE_CHANGE_PASSWORDを変更するには、次のようにユーザーでrespondToAuthChallenge()を呼び出します。
var params = {
ChallengeName: 'NEW_PASSWORD_REQUIRED',
ClientId: 'your_own3j63rs8j16bxxxsto25db00obh',
ChallengeResponses: {
USERNAME: 'user3',
NEW_PASSWORD: 'changed12345'
},
Session: 'xxxxxxxxxxZDMcRu-5u019i_gAcX5lw1biFnKLtfPrO2eZ-nenOLrr5xaHv-ul_-nGsOulyNG12H85GJ2UGiCGtfe-BdwTmQ-BMUnd2Twr9El45xgpGKWDrYcp11J4J9kZN71ZczynizRJ7oa5a_j2AiBYukzhd_YzPWGscrFu98qqn_JoiLsJ7w9v_C_Zpw6-ixCs09suYQKZ3YlWNFmMpC2nSiKrXUA8ybQkdj6vIO68d-vtYq0mVHt410v2TBtK4czOAh5MieO55kgvGHCxvEusQOTeFYh4Mjh1bwcHWRvSV6mVIrVSm4FnRs0u26vUDq79CgkuycRl2iOoqxc1abcaANKmEB45r2oPnmPZIhVqNO5eHe6fpac7s3pHwLKvNOv7EaQkjyY9Vb5gINmSjXBjBl3O3aqQ7KXyueuHHSLrfchP64SwuNQZSfL1Vis0ap5JtSat3udslzUBiU8FEhmJNwPX08QyIm4DqviTLp6lDqH5pH6BuvO9OUHPrEcDzufOx1a76pld-9f-NGfactCUZC0elQcAiGSqbwfiRYHn7TDHuX1WKf9L9E6GvhJhB154SxxhXsLm3Yv9DhWhOlVbhdbzR2Bq4dqJRDOPY2wengFX6v36TLlYZTHbGEc_PbSlx8Ru80avxehAmUNtNqDYjGbXq0vBWaEiJmkr1isF7XsCvrmZb6tHY'
};
cognitoidentityserviceprovider.respondToAuthChallenge(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
この後、コンソールにuser3ステータスがCONFIRMEDと表示されます
ログイン関数内のonSuccess: function (result) { ... },
の後にこのコードを追加してください。ユーザーのステータスは確認済みになります。
newPasswordRequired: function(userAttributes, requiredAttributes) {
// User was signed up by an admin and must provide new
// password and required attributes, if any, to complete
// authentication.
// the api doesn't accept this field back
delete userAttributes.email_verified;
// unsure about this field, but I don't send this back
delete userAttributes.phone_number_verified;
// Get these details and call
cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
}
まだこれと戦っているのかどうかはわかりませんが、テストユーザーのみを作成するために、awscli
を使用しました。
aws cognito-idp sign-up \
--region %aws_project_region% \
--client-id %aws_user_pools_web_client_id% \
--username %email_address% \
--password %password% \
--user-attributes Name=email,Value=%email_address%
aws cognito-idp admin-confirm-sign-up \
--user-pool-id %aws_user_pools_web_client_id% \
--username %email_address%
Amazon-cognito-identity-js SDKを使用してこれを解決するには、cognitoidentityserviceprovider.adminCreateUser()
でアカウントを作成した後、cognitoUser.completeNewPasswordChallenge()
内でcognitoUser.authenticateUser( ,{newPasswordRequired})
を実行して一時的なパスワードで認証します。ユーザーを作成します。
AWS lambda内で以下のコードを使用して、有効なCognitoユーザーアカウントを作成しています。最適化できると確信しています。我慢してください。これは私の最初の投稿であり、私はまだJavaScriptにかなり新しいです。
var AWS = require("aws-sdk");
var AWSCognito = require("Amazon-cognito-identity-js");
var params = {
UserPoolId: your_poolId,
Username: your_username,
DesiredDeliveryMediums: ["EMAIL"],
ForceAliasCreation: false,
MessageAction: "SUPPRESS",
TemporaryPassword: your_temporaryPassword,
UserAttributes: [
{ Name: "given_name", Value: your_given_name },
{ Name: "email", Value: your_email },
{ Name: "phone_number", Value: your_phone_number },
{ Name: "email_verified", Value: "true" }
]
};
var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();
let promise = new Promise((resolve, reject) => {
cognitoidentityserviceprovider.adminCreateUser(params, function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
promise
.then(data => {
// login as new user and completeNewPasswordChallenge
var anotherPromise = new Promise((resolve, reject) => {
var authenticationDetails = new AWSCognito.AuthenticationDetails({
Username: your_username,
Password: your_temporaryPassword
});
var poolData = {
UserPoolId: your_poolId,
ClientId: your_clientId
};
var userPool = new AWSCognito.CognitoUserPool(poolData);
var userData = {
Username: your_username,
Pool: userPool
};
var cognitoUser = new AWSCognito.CognitoUser(userData);
let finalPromise = new Promise((resolve, reject) => {
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function(authResult) {
cognitoUser.getSession(function(err) {
if (err) {
} else {
cognitoUser.getUserAttributes(function(
err,
attResult
) {
if (err) {
} else {
resolve(authResult);
}
});
}
});
},
onFailure: function(err) {
reject(err);
},
newPasswordRequired(userAttributes, []) {
delete userAttributes.email_verified;
cognitoUser.completeNewPasswordChallenge(
your_newPoassword,
userAttributes,
this
);
}
});
});
finalPromise
.then(finalResult => {
// signout
cognitoUser.signOut();
// further action, e.g. email to new user
resolve(finalResult);
})
.catch(err => {
reject(err);
});
});
return anotherPromise;
})
.then(() => {
resolve(finalResult);
})
.catch(err => {
reject({ statusCode: 406, error: err });
});
これが最終的にAWSCLIに追加されました: https://docs.aws.Amazon.com/cli/latest/reference/cognito-idp/admin-set-user-password.html
ユーザーのパスワードを変更し、ステータスを更新できます:
aws cognito-idp admin-set-user-password --user-pool-id <your user pool id> --username user1 --password password --permanent
これを使用する前に、次を使用してAWS CLIを更新する必要がある場合があります:
pip3 install awscli --upgrade
Java SDKの場合、Cognitoクライアントがセットアップされており、ユーザーがFORCE_CHANGE_PASSWORD状態にあると仮定すると、次の操作を行ってユーザーをCONFIRMED ...に取得し、通常どおりに認証できます。
AdminCreateUserResult createUserResult = COGNITO_CLIENT.adminCreateUser(createUserRequest());
AdminInitiateAuthResult authResult = COGNITO_CLIENT.adminInitiateAuth(authUserRequest());
Map<String,String> challengeResponses = new HashMap<>();
challengeResponses.put("USERNAME", USERNAME);
challengeResponses.put("NEW_PASSWORD", PASSWORD);
RespondToAuthChallengeRequest respondToAuthChallengeRequest = new RespondToAuthChallengeRequest()
.withChallengeName("NEW_PASSWORD_REQUIRED")
.withClientId(CLIENT_ID)
.withChallengeResponses(challengeResponses)
.withSession(authResult.getSession());
COGNITO_CLIENT.respondToAuthChallenge(respondToAuthChallengeRequest);
それらの統合テストに役立つことを願っています(フォーマットについてはごめんなさい)
私はそれが同じ答えであることを知っていますが、それはGo
開発者コミュニティに役立つかもしれないと思った。基本的には、認証リクエストを開始し、セッションを取得してチャレンジNEW_PASSWORD_REQUIRED
に応答します
func sessionWithDefaultRegion(region string) *session.Session {
sess := Session.Copy()
if v := aws.StringValue(sess.Config.Region); len(v) == 0 {
sess.Config.Region = aws.String(region)
}
return sess
}
func (c *CognitoAppClient) ChangePassword(userName, currentPassword, newPassword string) error {
sess := sessionWithDefaultRegion(c.Region)
svc := cognitoidentityprovider.New(sess)
auth, err := svc.AdminInitiateAuth(&cognitoidentityprovider.AdminInitiateAuthInput{
UserPoolId:aws.String(c.UserPoolID),
ClientId:aws.String(c.ClientID),
AuthFlow:aws.String("ADMIN_NO_SRP_AUTH"),
AuthParameters: map[string]*string{
"USERNAME": aws.String(userName),
"PASSWORD": aws.String(currentPassword),
},
})
if err != nil {
return err
}
request := &cognitoidentityprovider.AdminRespondToAuthChallengeInput{
ChallengeName: aws.String("NEW_PASSWORD_REQUIRED"),
ClientId:aws.String(c.ClientID),
UserPoolId: aws.String(c.UserPoolID),
ChallengeResponses:map[string]*string{
"USERNAME":aws.String(userName),
"NEW_PASSWORD": aws.String(newPassword),
},
Session:auth.Session,
}
_, err = svc.AdminRespondToAuthChallenge(request)
return err
}
単体テストは次のとおりです。
import (
"fmt"
"github.com/aws/aws-sdk-go/service/cognitoidentityprovider"
. "github.com/smartystreets/goconvey/convey"
"testing"
)
func TestCognitoAppClient_ChangePassword(t *testing.T) {
Convey("Testing ChangePassword!", t, func() {
err := client.ChangePassword("user_name_here", "current_pass", "new_pass")
Convey("Testing ChangePassword Results!", func() {
So(err, ShouldBeNil)
})
})
}
OK。最後に、管理者が新しいユーザーを作成できるコードがあります。プロセスは次のようになります。
ステップ1は難しい部分です。 Node JSでユーザーを作成するためのコードは次のとおりです。
let params = {
UserPoolId: "@cognito_pool_id@",
Username: username,
DesiredDeliveryMediums: ["EMAIL"],
ForceAliasCreation: false,
UserAttributes: [
{ Name: "given_name", Value: firstName },
{ Name: "family_name", Value: lastName},
{ Name: "name", Value: firstName + " " + lastName},
{ Name: "email", Value: email},
{ Name: "custom:title", Value: title},
{ Name: "custom:company", Value: company + ""}
],
};
let cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider();
cognitoIdentityServiceProvider.adminCreateUser(params, function(error, data) {
if (error) {
console.log("Error adding user to cognito: " + error, error.stack);
reject(error);
} else {
// Uncomment for interesting but verbose logging...
//console.log("Received back from cognito: " + CommonUtils.stringify(data));
cognitoIdentityServiceProvider.adminUpdateUserAttributes({
UserAttributes: [{
Name: "email_verified",
Value: "true"
}],
UserPoolId: "@cognito_pool_id@",
Username: username
}, function(err) {
if (err) {
console.log(err, err.stack);
} else {
console.log("Success!");
resolve(data);
}
});
}
});
基本的に、2番目のコマンドを送信して、メールを確認済みと見なす必要があります。ユーザーはまだ一時パスワードを取得するために電子メールにアクセスする必要があります(これにより、電子メールも検証されます)。ただし、メールを確認済みに設定する2回目の呼び出しがないと、パスワードをリセットするための正しい呼び出しが返されません。
基本的にこれは同じ答えですが、.Net C#SDKの場合:
以下は、目的のユーザー名とパスワードを使用して完全な管理ユーザーを作成します。次のユーザーモデルを持つ:
public class User
{
public string Username { get; set; }
public string Password { get; set; }
}
以下を使用して、ユーザーを作成し、使用する準備を整えることができます。
public void AddUser(User user)
{
var tempPassword = "ANY";
var request = new AdminCreateUserRequest()
{
Username = user.Username,
UserPoolId = "MyuserPoolId",
TemporaryPassword = tempPassword
};
var result = _cognitoClient.AdminCreateUserAsync(request).Result;
var authResponse = _cognitoClient.AdminInitiateAuthAsync(new AdminInitiateAuthRequest()
{
UserPoolId = "MyuserPoolId",
ClientId = "MyClientId",
AuthFlow = AuthFlowType.ADMIN_NO_SRP_AUTH,
AuthParameters = new Dictionary<string, string>()
{
{"USERNAME",user.Username },
{"PASSWORD", tempPassword}
}
}).Result;
_cognitoClient.RespondToAuthChallengeAsync(new RespondToAuthChallengeRequest()
{
ClientId = "MyClientId",
ChallengeName = ChallengeNameType.NEW_PASSWORD_REQUIRED,
ChallengeResponses = new Dictionary<string, string>()
{
{"USERNAME",user.Username },
{"NEW_PASSWORD",user.Password }
},
Session = authResponse.Session
});
}