web-dev-qa-db-ja.com

AWS Cognitoからのパスワードリンクを忘れた

新しいユーザーのサインアップ中にメールに確認リンクが表示されますが、それをクリックするとメールが正しく確認されるのですが、私はダミーのiosアプリケーション用にAWS cognitoを探索し始めました。

パスワードを忘れた場合と同じ機能がありますか。つまり、コードの代わりにリンクを取得して、ダミーのWebサイトにリダイレクトします。この場合、ユーザーが入力する必要があるのは新しいパスワードだけです。

前もって感謝します。

11
Raj

私は数か月前に尋ねたこの質問を忘れていました。答えで更新することを考えました。したがって、AWSドキュメントによると:
"このAPIを呼び出すと、ユーザーのパスワードを変更するために必要な確認コードを含むメッセージがエンドユーザーに送信されます。Usernameパラメータには、ユーザー名またはユーザーエイリアス。確認済みの電話番号がユーザーに存在する場合、確認コードが電話番号に送信されます。それ以外の場合、確認済みのメールが存在する場合、確認コードがメールに送信されます。確認済みの電話番号も検証済みのメールが存在するため、InvalidParameterExceptionがスローされます。 "
これはAWSドキュメントへのリンクです
そのため、いくつかの回避策があるかもしれませんが、パスワードを忘れた場合の自己確認リンクの送信は、現時点ではAWS Cognitoでサポートされていません。

4
Raj

私のプロジェクトでこれを達成した可能性があります。

これは、aws cognitoのトリガーを介して行われます。

カスタムメッセージトリガーで、トリガーするラムダ関数を設定します。

const AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {

    var CustomMessage_ForgotPassword = `<style>
        p {
        display: block;
        margin-block-start: 1em;
        margin-block-end: 1em;
        margin-inline-start: 0px;
        margin-inline-end: 0px;
        }
        </style>

        <div id=":x9" class="a3s aXjCH " role="gridcell" tabindex="-1"><p>Hello,</p>
        <p>Follow this link to reset your Password. </p>
        <p><a href="https://your-website.com/reset-password?confirmation_code=${event.request.codeParameter}&user_name=${event.userName}"> Reset Password </a></p>
        <p>If you didn’t ask to change password, you can ignore this email.</p>
        <p>Thanks,</p>
        <p>Your website team</p>
        </div>`


    if (event.triggerSource === "CustomMessage_ForgotPassword") {
        event.response.emailMessage = CustomMessage_ForgotPassword;
    }

    callback(null, event);
};

次に、あなたのウェブサイトで、このコードを処理する1つのルートを作成します。

9
Mayur Shingare

はい。 ForgotPassword エンドポイントを呼び出すことができます。

{
   "AnalyticsMetadata": { 
      "AnalyticsEndpointId": "string"
   },
   "ClientId": "string",
   "SecretHash": "string",
   "Username": "string"
 }

次に、(ウェブサイトのコードから) ConfirmForgotPassword エンドポイントを呼び出して、パスワードをリセットする必要があります。

{
   "AnalyticsMetadata": { 
      "AnalyticsEndpointId": "string"
   },
   "ClientId": "string",
   "ConfirmationCode": "string",
   "Password": "string",
   "SecretHash": "string",
   "Username": "string"
}
5
Derek Brown

私はこの質問に答えて受け入れたことを知っています。そして、Cognitoがそのままではこれを行わないのは事実ですが、これをシームレスに機能させる方法を見つけたかったのです。

これが私が思いついたものです:

  1. メール入力ボックスを使用して、Webサイトにページを作成します。ユーザーが送信したら、ユーザープールとメールを使用してCognitoUserインスタンスを作成し、ユーザーのforgotPassword関数を呼び出します。
  2. Mayur Shingareの回答に記載されているように、メールインターセプターLambdaを作成します。
  3. このLambdaをカスタムメッセージトリガーにフックします。これでユーザーは、標準の確認コードのメールではなく、確認パラメーターとクエリパラメーターに自分のメールを含むカスタムメールのメールを受信するはずです。
  4. ユーザーがリンクをクリックすると、ブラウザウィンドウが開き、サイトが表示されます。次に、これらのクエリパラメータをURLからプルします。このページには2つのボックスがあり、ユーザーはパスワードを入力して確認できます。
  5. 新しいパスワードの送信時に、ユーザープール、電子メール、および(クエリパラメーターからの)確認コードを使用して、CognitoUserインスタンスを取得し、confirmPassword関数を呼び出します。
  6. 成功したら、新しいパスワードを使用してプログラムでユーザーをログインさせるか、ユーザーをリダイレクトして手動でログインさせます。

これについて何か考えはありますか?同じ種類のメカニズムを使用して、ユーザー登録がシームレスに機能するようにしましたが、少し作業が必要でした。

3
Lodewyk

Lambda関数をトリガーして、一般設定->トリガー->ユーザープール(AWS)のカスタムメッセージにアタッチする必要があります。

以下がその例です。

exports.handler = (event, context, callback) => {
// https://docs.aws.Amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html
// dev
if(event.userPoolId === "YOUR USER POOL ID") {
    // Identify why was this function invoked
    if(event.triggerSource === "CustomMessage_ForgotPassword") {           
            event.response.smsMessage = "Your confirmation code is: " + event.request.codeParameter;
            event.response.emailSubject = "Confirmation Code";
            event.response.emailMessage = "Your confirmation code: " + event.request.codeParameter + "<br/><br/>Please visit this url and provide the requested information: ~your url~";   
        }        
}


// Return to Amazon Cognito
callback(null, event);
};
1
Onenesslover

新しいNode.jsバージョン> = 10を使用している場合、以下のバージョンが役立つ可能性があります

const AWS = require('aws-sdk');
exports.handler = async (event) => {
    
    var CustomMessage_ForgotPassword = `<style>
        p {
        display: block;
        font-size: 14px;
        margin-block-start: 1em;
        margin-block-end: 1em;
        margin-inline-start: 0px;
        margin-inline-end: 0px;
        }
        </style>

        <div>
        <p>
        <img align="center"
            alt="logo"
            src=""
            width="248"
            style="max-width:400px;padding-bottom:0px;vertical-align:bottom;display:inline!important;border:1px none;border-radius:0%;height:auto;outline:none;text-decoration:none"
            >
        <br/>
        <br/>
        <p style="font-size=28px;font-weight:bold;">You have submitted a password change request</p>
        <p>If this was you click the URL below to change your password</p>
        <p><a href="http://localhost:3000/auth/forgot-password?confirmation_code=${event.request.codeParameter}&user_name=${event.userName}"> Reset Password </a></p>
        
        </div>`


    if (event.triggerSource === "CustomMessage_ForgotPassword") {
        event.response.emailMessage = CustomMessage_ForgotPassword;
    }
    
    return event;
};

重要なのは、同じイベントオブジェクトを送り返し、新しい応答オブジェクトを作成しないことです。最も投票された回答のみに触発されます。ありがとう。

0
kaanchabhau