현재 cognito
를 이용해서 비밀번호를 관리하고 있는데, 사용자가 비밀번호를 변경하는것은 가능하지만 비밀번호를 분실했을때의 대응책이 없다 !!
사용자가 비밀번호를 분실했을때, 관리자의 권한(관리자만 접속 가능한 페이지 내에서 제어)으로 사용자의 비밀번호를 초기화 해 주는 기능을 구현했다 ^--^
해당 기능은 AWS에서 제공하는 adminSetUserPassword
이용하면 구현 가능하다.
Cognito의
adminSetUserPassword
은 AWS Cognito 서비스에서 관리자가 사용자의 비밀번호를 설정하거나 변경하는 데 사용되는 API 작업입니다. 이 작업은 관리자가 Cognito 사용자 풀에 등록된 사용자의 비밀번호를 관리하는 데 사용됩니다.
adminSetUserPassword를 호출하려면 Cognito 관리자 권한이 있는AWS 자격 증명
이 필요합니다.
사용자의 비밀번호 초기화
: 사용자가 비밀번호를 잊어버린 경우, 관리자는 adminSetUserPassword를 사용하여 임시 비밀번호를 설정하고 사용자에게 제공할 수 있습니다. 사용자는 이를 사용하여 로그인한 후 비밀번호를 변경해야 합니다.
사용자의 비밀번호 변경
: 관리자는 사용자의 요청이나 보안 정책에 따라 비밀번호를 변경할 수 있습니다. 이는 사용자가 현재 비밀번호를 알고 있어야 하는 경우에 유용합니다.
이 작업은 AWS SDK 또는 AWS CLI를 통해 수행할 수 있습니다. 호출 시 사용자 풀 식별자, 사용자 이름 또는 서브(user sub) 식별자, 그리고 새로운 비밀번호를 제공해야 합니다.
이제 본격적으로 기능을 구현 해 보려고 한다 !! 일단, cognito가 코드에 연결 되어 있다는 가정하에 기능을 구현했다.
const AWS = require('aws-sdk');
const cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider();
일단, AWS SDK를 사용하여 AWS CognitoIdentityServiceProvider
객체를 생성해준다. 이를 통해 Cognito User Pool
의 사용자 및 관리 작업
을 수행할 수 있다. (Node.js 환경 기준)
require('aws-sdk'): AWS SDK를 로드합니다. AWS SDK는 AWS 서비스와 상호작용하기 위해 사용되는 라이브러리입니다.
const cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider(): CognitoIdentityServiceProvider 객체를 생성합니다. 이 객체는 Cognito User Pool의 사용자 관리 작업을 수행하기 위한 메서드를 제공합니다. 이를 통해 사용자 생성, 삭제, 비밀번호 재설정 등의 작업을 수행할 수 있습니다.
AWS.config.update({
region: "리전정보"
accessKeyId: "ACCESS_KEY_ID",
secretAccessKey: "SECRET_ACCESS_KEY",
})
또한, adminSetUserPassword 기능을 사용하기 위해서는 리전(region) 및 자격 증명 정보(accessKeyId 및 secretAccessKey)를 구성해야한다.
ACCESS_KEY_ID와 SECRET_ACCESS_KEY 부분에 본인 AWS의 자격증명정보를 넣어주면 된다!!
이제 사용을 위한 세팅은 끝났고, 코드는 다음과 같이 구현하였다.
"비밀번호 변경" 버튼을 누르면 연결되는 부분이다.
exports.adminChangePassword = (reqParams) => new Promise((resolve, reject) => {
try {
const loginId = reqParams.loginId;
const newPassword = reqParams.newPassword;
// const newPassword = 'testTest123!'; // 초기화할 비밀번호 직접 설정 가능
const params = {
UserPoolId: UserPoolId,
Username: loginId,
Password: newPassword,
Permanent: true // 관리자가 비밀번호를 변경하는 경우 Permanent 속성을 true로 설정해야 합니다.
};
console.log(params);
cognitoIdentityServiceProvider.adminSetUserPassword(params, function(err, result) {
if (err) {
console.log(err);
reject(err);
} else {
console.log("Successfully changed password of the user.");
console.log(result);
resolve(result);
}
});
} catch (err) {
console.log(err);
reject(err);
}
});
작업을 위해서는 params에 담긴것처럼 총 4개의 매개변수가 필요하다.
UserPoolId: Cognito User Pool의 식별자입니다. 비밀번호를 변경할 대상 사용자가 속한 User Pool을 지정합니다.
Username: 비밀번호를 변경할 사용자의 이름입니다. 이는 사용자의 로그인 아이디(loginId)와 일치합니다.
Password: 사용자에게 할당할 새로운 비밀번호입니다. 이 비밀번호는 사용자가 로그인할 때 사용됩니다.
Permanent: true: 이 속성을 true로 설정하여 관리자가 비밀번호를 변경하는 경우, 사용자에게 일시적인 비밀번호를 요청하도록 하지 않고 바로 비밀번호를 변경합니다. 이는 일회성 비밀번호를 사용하지 않고 영구적인 비밀번호로 변경하는 경우에 사용됩니다.
그리고 위에 표시한것처럼 const newPassword = reqParams.newPassword
로 파라미터 값을 받아와서 비밀번호를 설정해도 되고, 아예 초기 비밀번호를 고정으로 설정 해 두어도 된다.
다만, 비밀번호는 cognito의 규정에 맞게 설정 되어 있어야 하니 파라미터 값을 받아와서 변경 할 경우 비밀번호 유효성 검증하는 코드가 추가로 필요하다 !!
이제 관리자가 사용자의 비밀번호를 변경 해 주는것이 가능하다.
추가로, 비밀번호를 잘못 입력하거나 오류가 발생하는 경우가 있을 수 있으니 Error에 대한 대응 코드도 추가 해 주어야 한다.
참고로, Error 목록은 다음과 같다
InternalErrorException
This exception is thrown when Amazon Cognito encounters an internal error.
HTTP Status Code: 500
InvalidParameterException
This exception is thrown when the Amazon Cognito service encounters an invalid parameter.
HTTP Status Code: 400
InvalidPasswordException
This exception is thrown when Amazon Cognito encounters an invalid password.
HTTP Status Code: 400
NotAuthorizedException
This exception is thrown when a user isn't authorized.
HTTP Status Code: 400
ResourceNotFoundException
This exception is thrown when the Amazon Cognito service can't find the requested resource.
HTTP Status Code: 400
TooManyRequestsException
This exception is thrown when the user has made too many requests for a given operation.
HTTP Status Code: 400
UserNotFoundException
This exception is thrown when a user isn't found.
HTTP Status Code: 400
각 에러별 처리를 해 주면 될 것 같다! 자세한 내용은 AWS 홈페이지에서도 참고 가능하다 😌