web-dev-qa-db-ja.com

確認URLを使用してAmazon Cognitoを確認した後にリダイレクトする方法

Amazon cognitoでユーザーの確認後に特定のURLにリダイレクトしたい。

ユーザーがサインアップすると、次のような確認リンクが記載された確認メールが届きます https:// <> .auth.us-west-2.amazoncognito.com/confirmUser?client_id = << >>&user_name = < <>>&confirmation_code = << >>

ユーザーが上記のリンクをクリックすると、確認ページにリダイレクトされます。

ユーザーの確認が完了すると、ページはアプリケーションにリダイレクトされます。

この問題を解決するためのアイデアを教えてください。

19
Richardson. M

現在、このリダイレクトはメールの確認リンクを使用して行うことはできません。しばらく前にredirect_uriを確認URLに追加しようとしましたが、機能しません。

回避策

これは、このような単純な要件に対する複雑な回避策であることを知っています。最適な方法は、機能要求を提起し、Cognito URLでredirect_uriをサポートすることを期待することです。

[〜#〜] edit [〜#〜]

ラムダコストを節約するには、APIでHTTPエンドポイントを使用し、地域の cognitoサービスエンドポイント にリクエストを行うこともできます。例:

POST  HTTP/1.1
Host: cognito-idp.us-east-1.amazonaws.com
x-amz-target: AWSCognitoIdentityProviderService.ConfirmSignUp
Content-Type: application/x-amz-json-1.1

{
  "ClientId":"xxxxxxxxxxxxx",
  "ConfirmationCode":"123456",
  "Username":"username"
}
15
agent420

はい、これを機能リクエストとしてマークします。ただし、この時点で配達時間を見積もることはできません。

3
crystalwang

私はこれを@ agent420の上記の回答の助けを借りて動作させ、githubの問題を調べました https://github.com/aws-amplify/amplify-js/issues/612

したがって、ここに私が従った完全なプロセスがあります。

  • 最初に、ラムダを介してユーザーを確認するときにコードを取得する必要があるため、検証方法をリンクからコードに変更する必要があります。 Cognito(AWSコンソール)でこれを行うには、[メッセージのカスタマイズ]-> [検証の種類]に移動し、[コード]に変更します。
  • 次に、確認メールを送信する前に起動するラムダトリガーを追加します。これにラムダを追加するには、Lambda(AWS Console)に移動し、関数を作成します。以下に、私が使用したラムダを示します。
exports.handler = (event, context, callback) => {
    // Identify why was this function invoked
    if(event.triggerSource === "CustomMessage_SignUp") {
        console.log('function triggered');
        console.log(event);
        // Ensure that your message contains event.request.codeParameter. This is the placeholder for code that will be sent
        const { codeParameter } = event.request
        const { userName, region } = event
        const { clientId } = event.callerContext
        const { email } = event.request.userAttributes
        const url = 'https://example.com/api/dev/user/confirm'
        const link = `<a href="${url}?code=${codeParameter}&username=${userName}&clientId=${clientId}&region=${region}&email=${email}" target="_blank">here</a>`
        event.response.emailSubject = "Your verification link"; // event.request.codeParameter
        event.response.emailMessage = `Thank you for signing up. Click ${link} to verify your email.`;
    }

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

メールは、event.response.emailSubjectおよびevent.response.emailMessageで指定された件名とメッセージと共に送信されます。ユーザーは、url変数で指定されたURLにリダイレクトされます。

  • トリガーを追加するには、Cognito(Aws-console)Triggers-> Custom messageを選択し、作成したラムダを選択します。
  • ユーザーはURLにリダイレクトするため、リクエストを制御し、ユーザーを確認して、選択したURLにリダイレクトします。

AWS APIGatewayを使用して、これにラムダを使用しました。以下は、301リダイレクトを使用したnodejsで記述したコードです。

'use strict';
var AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('bluebird'));
var CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: process.env.REGION });

module.exports.verifyEmailAddress = (req, context, callback) => {

  console.log('req');
  console.log(req);
  const confirmationCode = req.queryStringParameters.code
  const username = req.queryStringParameters.username
  const clientId = req.queryStringParameters.clientId
  const region = req.queryStringParameters.region
  const email = req.queryStringParameters.email

  let params = {
    ClientId: clientId,
    ConfirmationCode: confirmationCode,
    Username: username
  }

  var confirmSignUp = CognitoIdentityServiceProvider.confirmSignUp(params).promise()

  confirmSignUp.then(
    (data) => {
      let redirectUrl = process.env.POST_REGISTRATION_VERIFICATION_REDIRECT_URL;
      const response = {
        statusCode: 301,
        headers: {
          Location: redirectUrl,
        }
      };
    
      return callback(null, response);
    }
  ).catch(
    (error) => {
      callback(error)
    }
  )
}

環境変数REGIONおよびPOST_REGISTRATION_VERIFICATION_REDIRECT_URLを要件に応じて自分の値に置き換えます。

1