## 概要 [Task1594: API実装(メール認証)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/1594) - メール認証APIを作成 - src/api/common/にpasswordを追加(ランダムパスワード発行ロジック) - src/fuatures/gateway/adb2c.service.tsにユーザのパスワードを変更するメソッドchangePasswordを追加 - user.service.spec.tsにメール認証と仮パスワード発行のテストケースを追加 - 影響範囲 (user.service.spec.tsで行っていた既存のテストケース) ## レビューポイント - commonにpasswordを追加したが、配置として適切かどうか - user.service.tsのエラー発生時のロジックが十分であるか ## 動作確認状況 - ローカルで確認
46 lines
2.1 KiB
TypeScript
46 lines
2.1 KiB
TypeScript
export const makePassword = (): string => {
|
||
// パスワードの文字数を決定
|
||
const passLength = 8;
|
||
|
||
// パスワードに使用可能な文字を決定(今回はアルファベットの大文字と小文字 + 数字 + symbolsの記号)
|
||
const lowerCase = 'abcdefghijklmnopqrstuvwxyz';
|
||
const upperCase = lowerCase.toLocaleUpperCase();
|
||
const numbers = '0123456789';
|
||
const symbols = "!@#$%^&*()+-={}[]:;'<>,./?_∼\\";
|
||
const chars = lowerCase + upperCase + numbers + symbols;
|
||
|
||
// 英字の大文字、英字の小文字、アラビア数字、記号(!@#$%^&*()+-={}[]:;'<>,./?_∼\)から2種類以上組み合わせ
|
||
const charaTypePattern =
|
||
/^((?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[a-z])(?=.*[!@#$%^&*()+-={}:;'<>,./?_~[\\\]])|(?=.*[A-Z])(?=.*[\d])|(?=.*[A-Z])(?=.*[!@#$%^&*()+-={}:;'<>,./?_~[\\\]])|(?=.*[\d])(?=.*[!@#$%^&*()+-={}:;'<>,./?_~[\\\]]))[a-zA-Z\d!@#$%^&*()+-={}:;'<>,./?_~[\\\]]/;
|
||
|
||
// 同じ文字の3連続は禁止
|
||
const repeatPattern = /(.)\1{2,}/;
|
||
|
||
// 特定文字列は禁止
|
||
const unavailableCharaPattern =
|
||
/password|passwd|test|admin|administrator|sysadmin|0123|1234|2345|3456|4567|5678|6789|9876|8765|7654|6543|5432|4321|3210/;
|
||
|
||
// autoGeneratedPasswordが以上の条件を満たせばvalidがtrueになる
|
||
let valid = false;
|
||
let autoGeneratedPassword: string;
|
||
|
||
while (!valid) {
|
||
autoGeneratedPassword = '';
|
||
// パスワードをランダムに決定
|
||
while (autoGeneratedPassword.length < passLength) {
|
||
// 上で決定したcharsの中からランダムに1文字ずつ追加
|
||
const index = Math.floor(Math.random() * chars.length);
|
||
autoGeneratedPassword += chars[index];
|
||
}
|
||
|
||
// パスワードが上で決定した条件をすべて満たしているかチェック
|
||
// 条件を満たすまでループ
|
||
valid =
|
||
autoGeneratedPassword.length == passLength &&
|
||
charaTypePattern.test(autoGeneratedPassword) &&
|
||
!repeatPattern.test(autoGeneratedPassword) &&
|
||
!unavailableCharaPattern.test(autoGeneratedPassword);
|
||
}
|
||
return autoGeneratedPassword;
|
||
};
|