如何使用确认URL确认amazon cognito后重定向?

时间:2017-11-07 13:47:42

标签: amazon-web-services aws-sdk amazon-cognito aws-cognito

我希望在亚马逊认知用户确认后重定向到特定网址。

当用户注册时,他将收到带有验证链接的确认邮件,如下所示 https://<>.auth.us-west-2.amazoncognito.com/confirmUser?client_id=<<>>&user_name=<<>>&confirmation_code=<<>>

如果用户点击上述链接,则会重定向到确认页面。

用户确认完成后,页面应重定向到我的应用程序。

请给我一些解决这个问题的建议。

5 个答案:

答案 0 :(得分:15)

目前,此重定向无法使用电子邮件中的验证链接完成。我曾尝试将redirect_uri添加到验证网址,但它们无效。

解决方法

我知道这对于这样一个简单的要求来说是一个复杂的解决方法。最好的方法是提出功能请求,并希望他们支持Cognito URL中的redirect_uri。

修改

要节省您的lambda费用,您还可以在API中使用HTTP端点,并向您所在地区的cognito service endpoint发出请求。例如:

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"
}

答案 1 :(得分:4)

我在@ agent420的上述答复的帮助下,并研究了github问题https://github.com/aws-amplify/amplify-js/issues/612

这是我遵循的完整过程。

  • 首先,我们需要将验证方法更改为来自链接的代码    因为我们在通过确认用户时需要获取代码    lambda。要在Cognito(AWS控制台)中执行此操作,请转到消息自定义->    验证类型,将其更改为“代码”。
  • 接下来,我们将添加发送前要触发的lambda触发器 电子邮件验证。要为此添加lambda,请转到Lambda(AWS 控制台)并创建一个函数。下面是我使用的lambda。

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.emailSubjectevent.response.emailMessage中指定的主题和消息一起发送。用户将定向到url变量中指定的url。

  • 要添加触发器,请转到Cognito(Aws-console)触发器->自定义 消息,然后选择您刚创建的lambda。
  • 由于用户将定向到我们的网址,因此我们可以控制请求, 确认用户并重定向到您选择的网址。

为此,我通过使用AWS APIGateway使用了一个lambda。下面给出的是我在nodejs中使用301重定向编写的代码。

'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)
    }
  )
}

根据需要用您的值替换环境变量REGIONPOST_REGISTRATION_VERIFICATION_REDIRECT_URL

答案 2 :(得分:3)

是的,我们会将此标记为功能请求。但是,我们无法估计此时的交货时间。

答案 3 :(得分:0)

完整的设置指南。

  

感谢@yasith,从简单的图片开始,以明确我们的工作方式,

enter image description here 步骤1:使用您选择的语言创建一个lambda函数,下面的示例将使用node.js。 请先阅读自定义消息Lambda触发器,然后再继续https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html 在此示例中,我仅处理CustomMessage_SignUp,您可以根据需要为其他消息(如CustomMessage_ForgotPassword等)进行自定义。 将以下代码复制到您的lambda函数中,

// Creating a custom URL for the user
exports.handler = (event, context, callback) => {
    if(event.triggerSource === "CustomMessage_SignUp") {
        const { codeParameter } = event.request;
        const { userName, region } = event;
        const { clientId } = event.callerContext;
        const { email } = event.request.userAttributes;
        const url = 'https://xxxxxxx.execute-api.eu-west-2.amazonaws.com/prod/redirect'
        const link = `<a href="${url}?code=${codeParameter}&username=${userName}&clientId=${clientId}&region=${region}&email=${email}" target="_blank">Click the link to verify</a>`;
        event.response.emailSubject = "Your verification link";
        event.response.emailMessage = `Thank you for signing up. Click ${link} to verify your email.`;
    }
// CallBack to the lambda for the email trigger
    callback(null, event);
};
  

注意:在设置API网关后,应更新const URL。

步骤2:在您的Cognito触发器下,选择自定义消息,然后选择已创建的lambda函数

enter image description here 第3步:在您的API网关中创建GET API 请勿设置任何授权或启用任何所需的API密钥。

enter image description here enter image description here 步骤4:创建另一个Lambda函数以验证并确认用户。

'use strict';
var AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('bluebird'));
var CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({
    apiVersion: '2019-11-07',
    region: process.env.REGION
});
exports.handler = (req, context, callback) => {
console.log(req);
    const confirmationCode = req.code;
    const username = req.username;
    const clientId = req.clientId;
let params = {
        ClientId: clientId,
        ConfirmationCode: confirmationCode,
        Username: username
    };
//Validating the user
let confirmSignUp = CognitoIdentityServiceProvider.confirmSignUp(params).promise();
//Returning the redirect url
confirmSignUp.then(
        (data) => {
            context.succeed({
                location: process.env.POST_REGISTRATION_VERIFICATION_REDIRECT_URL
            });
        }
    ).catch(
        (error) => {
            callback(error.message)
        }
    )
};

在您选择的IDE中创建一个节点应用程序,然后在构建应用程序后使用npm install进行构建。 创建一个zip文件(根据您的IDE大约在根文件夹5文件中)并上传到您的lambda应用程序。

  

Lambda Handler方法应为= index.handler

在lambda env变量中设置以下内容

  

POST_REGISTRATION_VERIFICATION_REDIRECT_URL REGION

在您的应用程序中,您正在验证cognito用户池中的用户并返回重定向的URL。 不在范围内:错误情况也可以根据您的要求进行处理。

第5步:返回到API网关,创建GET请求,并放入必须在第4步中创建的Lambda函数,并更新映射模板。

enter image description here enter image description here

第6步:现在,我们必须根据您的lambda响应重定向请求, 在API网关的“方法响应”下,删除200并创建302,然后根据图像添加响应标头位置,

enter image description here 然后在“集成响应”中,您需要删除200并添加302,然后将标头“映射”值添加为 integration.response.body.location (请注意字符大小写) enter image description here

  

最重要的步骤:完成所有设置后,部署API并更新   在第一步中创建的Lambda函数中的const URL API。

尝试创建测试用户,并且用户必须具有类似这样的电子邮件链接, https://xxxx-api.eu-west-2.amazonaws.com/dev/pp/participant/redirect?code=123456&username=1046623232-0105-486f-896-7b4ed61e51bf&clientId=5fakeClienID&region=eu-west-2&email=test@gmail.com

答案 4 :(得分:0)

现在,当将auth资源添加到项目amplify add auth时,您可以手动配置确认重定向lambda函数。 Check it out