[AWS Cognito] 이메일 주소 확인 URL에 액세스 후 리디렉션합니다.
소개
현재 졸업 제작에서 AWS를 채용하여 서비스를 개발하고 있습니다.
인증은 Cognito를 사용하고 있습니다만 그 안에서 일어난 트러블입니다.
Cognito에서 이메일 주소 확인을 활성화하면, 사용자가 신규 등록했을 때, 등록한 Email에 자동적으로 확인용 Link가 포함된 메일이 가고, 그 Link를 Click하면 메일 주소가 인증되는 구조가 되어 있다 합니다.
그러나 문제는 기본적으로 제공되는 확인 링크가 확인 성공 후 redirect하는 URL을 설정할 수 없다는 것입니다.
stackoverflow와 github 이슈를 보아도
How to redirect after confirm amazon cognito using confirmation URL?
Redirect to url after clicking email verification link
향후의 신규 추가 기능으로서 마크는 하고 있는 것 같습니다만, 아직 구현은 되어 있지 않은 것 같네요.
사용성에 큰 영향을 줄 것 같아서 AWS가 대응하기 전에 직접 구현하려고 했습니다.
아키텍처
Cognito 확인 URL을 랩핑하고 리디렉션 응답을 반환하는 엔드포인트를 만들고 여기에 액세스하도록 했습니다. 확인 링크도 동적으로 만들어야 하므로 Cognito의 사용자 지정 메시지 트리거에 람다를 연결합니다.
Original Confirm Email Lambda
Node.JS로 작성했습니다.
index.js
const https = require('https');
const cognitoAuthUri = "https://<Pool名>.auth.ap-northeast-1.amazoncognito.com/confirmUser";
const getSuccessResponseBody = redirectUri => `
<HTML>
<HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=${redirectUri}">
<TITLE>Success</TITLE>
</HEAD>
<BODY>
<H1>Success Email Confirmation</H1>
<A HREF="http://www.google.com/">here</A>.
</BODY>
</HTML>
`;
exports.handler = (event, context, callback) => {
const err = null;
const {
client_id : clientId,
user_name : userName,
confirmation_code: confirmationCode,
redirect_uri : redirectUri
} = event.queryStringParameters;
if (!clientId)
err = "client_id param is required";
if (!userName)
err = "user_name param is required";
if (!confirmationCode)
err = "confirmation_code param is required";
if (!redirectUri)
err = "redirect_uri param is required";
if (err) {
callback(
null,
{
statusCode: "400",
body: JSON.stringify({ error: err }),
headers: {
"Content-Type": "application/json",
},
}
);
return;
}
https.get(
`${cognitoAuthUri}?client_id=${clientId}&user_name=${userName}&confirmation_code=${confirmationCode}`,
res => {
callback(
null,
{
statusCode: "301",
body: getSuccessResponseBody(redirectUri),
headers: {
"Content-Type": "text/html; charset=UTF-8",
},
}
);
return;
}
).on("error", e => {
console.error(e);
callback(
null,
{
statusCode: "400",
body: JSON.stringify({ error: e.message }),
headers: {
"Content-Type": "application/json",
},
}
);
return;
});
};
성공시에 받은 redirectURL에 Redirect하도록 하고 있습니다.
생성 후 API-Gateway에 Attach하여 API로 이동합니다.
Custom Message Lambda
이쪽도 Node.JS로 썼습니다.
신규 등록된 사용자명과 확인용 코드로부터, 방금 작성한 Endpoint에의 Link를 작성합니다.
index.js
const cofirmEmailURL = "新しく作成したEmail確認用URL";
const userPoolId = "ユーザープールID";
const cognitoClientId = "CognitoクライアントID";
const redirectURI = "リダイレクト先URL";
const getEmailMessage = (userName, confirmationCode) => (`
Follow this link to finish the registration
<a href=${cofirmEmailURL}?client_id=${cognitoClientId}&user_name=${userName}&confirmation_code=${confirmationCode}&redirect_uri=${redirectURI}>Click Here</a>
`);
exports.handler = (event, context, callback) => {
if(event.userPoolId === userPoolId) {
if(event.triggerSource === "CustomMessage_SignUp") {
event.response.emailSubject = "Welcome to MyAPP! Please verify your Email Adress.";
event.response.emailMessage = getEmailMessage(event.request.userAttributes.email, event.request.codeParameter);
}
}
callback(null, event);
};
Cognito 설정
기본 이메일 주소 확인 링크를 변경하려면 맞춤 메시지 트리거를 사용하여 본문을 변경합니다.
이 때, 검증 타입은 코드로 해 둘 필요가 있습니다.
트리거도 Attach하고 저장합니다.
이것만으로 완성입니다.
요약
Lambda의 Trigger가 너무 풍부하고 놀랍습니다. 부족한 일 있어도 뭐든지 해결할 수 있을 것 같다.
그렇지만, 원래 중요한 기능이라고 생각하기 때문에 빨리 AWS가 대응해 주었으면 한다.
Reference
이 문제에 관하여([AWS Cognito] 이메일 주소 확인 URL에 액세스 후 리디렉션합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rioc/items/523360527d7253a50d28텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)