電話番号をアプリのユーザー名として使用し、ログインするたびに電話番号を確認するだけで簡単にサインアップできるようにしたい-面倒なパスワードを覚えているビジネスはありません。
AWS Cognitoユーザープールを使用して、各ユーザーのパスワードを強制的に設定するように要求するときにこれを行う方法。
各ユーザーにダミーのパスワードを使用し、必須のユーザー検証を構成することを考えました。ユーザーがサインアウトするたびに、次回ユーザーに電話番号の確認を自動的に求められるように、ユーザーを「確認解除」できます。また、ユーザーが確認された場合にのみ「ログイン」にアプリを接続します。
これが最良のアプローチかどうかを教えてください:(私はAWSを初めて使用し、このシナリオに関する投稿を見つけることができませんでした。
ありがとう!!
AWS Cognitoは現在、パスワードなしの認証をサポートしていないため、外部に保存されたランダムパスワードを使用して回避策を実装する必要があります。認証フローは次のように実装できます。
MFAの洞察を理解するには、次のコードサンプルを確認し、詳細については このリンク を参照してください。
var userData = {
Username : 'username',
Pool : userPool
};
cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
var authenticationData = {
Username : 'username',
Password : 'password',
};
var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function (result) {
alert('authentication successful!')
},
onFailure: function(err) {
alert(err);
},
mfaRequired: function(codeDeliveryDetails) {
var verificationCode = Prompt('Please input verification code' ,'');
cognitoUser.sendMFACode(verificationCode, this);
}
});
注:ここでは、モバイル番号付きMFAはMFAの目的ではなく、要件を満たすための回避策として使用されています。
これは、OPが1つの秘密を使用しているため、OPが要求しているものとは少し異なりますが、この質問に答える他の人の助けになると思います。
Cognitoトリガーのカスタムラムダを作成することでこれを行うことができました:認証チャレンジの定義、認証チャレンジの作成、および認証チャレンジの検証。
私の要件は、バックエンドでsecret
を使用して、Cognitoユーザーのアクセストークンと更新トークンを取得することでした。
Auth Challenge Lambdaを定義する
exports.handler = async event => {
if (
event.request.session &&
event.request.session.length >= 3 &&
event.request.session.slice(-1)[0].challengeResult === false
) {
// The user provided a wrong answer 3 times; fail auth
event.response.issueTokens = false;
event.response.failAuthentication = true;
} else if (
event.request.session &&
event.request.session.length &&
event.request.session.slice(-1)[0].challengeResult === true
) {
// The user provided the right answer; succeed auth
event.response.issueTokens = true;
event.response.failAuthentication = false;
} else {
// The user did not provide a correct answer yet; present challenge
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'CUSTOM_CHALLENGE';
}
return event;
};
Auth Challenge Lambdaの作成
exports.handler = async event => {
if (event.request.challengeName == 'CUSTOM_CHALLENGE') {
// The value set for publicChallengeParameters is arbitrary for our
// purposes, but something must be set
event.response.publicChallengeParameters = { foo: 'bar' };
}
return event;
};
認証チャレンジLambdaの検証
exports.handler = async event => {
if (event.request.challengeName == 'CUSTOM_CHALLENGE') {
// The value set for publicChallengeParameters is arbitrary for our
// purposes, but something must be set
event.response.publicChallengeParameters = { foo: 'bar' };
}
return event;
};
それから Amazon-cognito-identity-js を使用して、いくつかのJSを使用して秘密を提供し、トークンを取得することができました。
var authenticationData = {
Username : 'username'
};
var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
var poolData = {
UserPoolId : '...', // Your user pool id here
ClientId : '...' // Your client id here
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
var userData = {
Username : 'username',
Pool : userPool
};
var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
cognitoUser.setAuthenticationFlowType('CUSTOM_AUTH');
cognitoUser.initiateAuth(authenticationDetails, {
onSuccess: function(result) {
// User authentication was successful
},
onFailure: function(err) {
// User authentication was not successful
},
customChallenge: function(challengeParameters) {
// User authentication depends on challenge response
var challengeResponses = 'secret'
cognitoUser.sendCustomChallengeAnswer(challengeResponses, this);
}
});
これは機能する可能性がありますが、パスワードをdynamoDBに保存すると、セキュリティを考慮すると問題が発生する場合があります。代わりに、次のように試すことができます。
option#1:-ユーザーはユーザー名とパスワードでサインアップします。
option#1:-ユーザー名とパスワードなしでユーザーがサインアップします。Cognito setup
トリガーコードについては、 マルチサインインオプションのあるCognitoプールを参照 を参照してください