Merged PR 576: dev環境不具合修正

## 概要
[Task3046: dev環境不具合修正](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3046)

- 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず)
- 何をどう変更したか、追加したライブラリなど
- このPull Requestでの対象/対象外
- 影響範囲(他の機能にも影響があるか)

## レビューポイント
- 特にレビューしてほしい箇所
- 軽微なものや自明なものは記載不要
- 修正範囲が大きい場合などに記載
- 全体的にや仕様を満たしているか等は本当に必要な時のみ記載

## UIの変更
- Before/Afterのスクショなど
- スクショ置き場

## 動作確認状況
- ローカルで確認、develop環境で確認など

## 補足
- 相談、参考資料などがあれば
This commit is contained in:
maruyama.t 2023-11-13 06:01:49 +00:00
parent e228d06cc7
commit 35923f84e2
7 changed files with 52 additions and 9 deletions

View File

@ -39,6 +39,12 @@ export const UNAUTHORIZED_TO_CONTINUE_ERROR_CODES = [
"E010501", "E010501",
]; ];
/**
*
* @const {string[]}
*/
export const KEYS_TO_PRESERVE = ["accessToken", "refreshToken", "displayInfo"];
/** /**
* *
* @const {number} * @const {number}

View File

@ -1,6 +1,7 @@
import { createAsyncThunk } from "@reduxjs/toolkit"; import { createAsyncThunk } from "@reduxjs/toolkit";
import type { RootState } from "app/store"; import type { RootState } from "app/store";
import { setToken } from "features/auth"; import { setToken } from "features/auth";
import { KEYS_TO_PRESERVE } from "components/auth/constants";
import { import {
AuthApi, AuthApi,
UsersApi, UsersApi,
@ -42,7 +43,18 @@ export const loginAsync = createAsyncThunk<
refreshToken: data.refreshToken, refreshToken: data.refreshToken,
}) })
); );
// ローカルストレージに残すキー
const keysToPreserve = KEYS_TO_PRESERVE;
// すべてのローカルストレージキーを取得
const allKeys = Object.keys(localStorage);
// 特定のキーを除外して削除
allKeys.forEach((key) => {
if (!keysToPreserve.includes(key)) {
localStorage.removeItem(key);
}
});
return data; return data;
} catch (e) { } catch (e) {
// e ⇒ errorObjectに変換" // e ⇒ errorObjectに変換"

View File

@ -1 +1,3 @@
export const ADB2C_PREFIX = 'adb2c-external-id:'; export const ADB2C_PREFIX = 'adb2c-external-id:';
export const IDTOKEN_PREFIX = 'id-token:';

View File

@ -1,4 +1,4 @@
import { ADB2C_PREFIX } from './constants'; import { ADB2C_PREFIX, IDTOKEN_PREFIX } from './constants';
/** /**
* ADB2Cのユーザー格納用のキーを生成する * ADB2Cのユーザー格納用のキーを生成する
@ -17,3 +17,12 @@ export const makeADB2CKey = (externalId: string): string => {
export const restoreAdB2cID = (key: string): string => { export const restoreAdB2cID = (key: string): string => {
return key.replace(ADB2C_PREFIX, ''); return key.replace(ADB2C_PREFIX, '');
}; };
/**
* ADB2CのIDトークン格納用のキーを生成する
* @param idToken IDトークン
* @returns
*/
export const makeIDTokenKey = (idToken: string): string => {
return `${IDTOKEN_PREFIX}${idToken}`;
};

View File

@ -38,6 +38,8 @@ import { TermsService } from '../../features/terms/terms.service';
import { TermsRepositoryModule } from '../../repositories/terms/terms.repository.module'; import { TermsRepositoryModule } from '../../repositories/terms/terms.repository.module';
import { TermsModule } from '../../features/terms/terms.module'; import { TermsModule } from '../../features/terms/terms.module';
import { CacheModule } from '@nestjs/common'; import { CacheModule } from '@nestjs/common';
import { RedisModule } from '../../gateways/redis/redis.module';
import { RedisService } from '../../gateways/redis/redis.service';
export const makeTestingModule = async ( export const makeTestingModule = async (
datasource: DataSource, datasource: DataSource,
@ -77,6 +79,7 @@ export const makeTestingModule = async (
SortCriteriaRepositoryModule, SortCriteriaRepositoryModule,
WorktypesRepositoryModule, WorktypesRepositoryModule,
TermsRepositoryModule, TermsRepositoryModule,
RedisModule,
CacheModule.register({ isGlobal: true }), CacheModule.register({ isGlobal: true }),
], ],
providers: [ providers: [
@ -90,6 +93,7 @@ export const makeTestingModule = async (
TemplatesService, TemplatesService,
WorkflowsService, WorkflowsService,
TermsService, TermsService,
RedisService,
], ],
}) })
.useMocker(async (token) => { .useMocker(async (token) => {

View File

@ -33,6 +33,8 @@ import { RoleGuard } from '../../common/guards/role/roleguards';
import { ADMIN_ROLES, TIERS } from '../../constants'; import { ADMIN_ROLES, TIERS } from '../../constants';
import jwt from 'jsonwebtoken'; import jwt from 'jsonwebtoken';
import { AccessToken, RefreshToken } from '../../common/token'; import { AccessToken, RefreshToken } from '../../common/token';
import { makeIDTokenKey } from '../../common/cache';
import { RedisService } from '../../gateways/redis/redis.service';
@ApiTags('auth') @ApiTags('auth')
@Controller('auth') @Controller('auth')
@ -41,6 +43,7 @@ export class AuthController {
// TODO「タスク 1828: IDトークンを一度しか使えないようにする」で使用する予定 // TODO「タスク 1828: IDトークンを一度しか使えないようにする」で使用する予定
// private readonly redisService: RedisService, // private readonly redisService: RedisService,
private readonly authService: AuthService, private readonly authService: AuthService,
private readonly redisService: RedisService,
) {} ) {}
@Post('token') @Post('token')
@ -77,6 +80,18 @@ export class AuthController {
const context = makeContext(uuidv4()); const context = makeContext(uuidv4());
const key = makeIDTokenKey(body.idToken);
const isTokenExists = await this.redisService.get<boolean>(key);
if (!isTokenExists) {
// IDトークンがキャッシュに存在しない場合(idTokenの有効期限をADB2Cの有効期限と合わせる(300秒))
await this.redisService.set(key, true, 300);
} else {
// IDトークンがキャッシュに存在する場合エラー
throw new HttpException(
makeErrorResponse('E000106'),
HttpStatus.UNAUTHORIZED,
);
}
// 同意済み利用規約バージョンが最新かチェック // 同意済み利用規約バージョンが最新かチェック
const isAcceptedLatestVersion = const isAcceptedLatestVersion =
await this.authService.isAcceptedLatestVersion(context, idToken); await this.authService.isAcceptedLatestVersion(context, idToken);

View File

@ -4,15 +4,10 @@ import { AdB2cModule } from '../../gateways/adb2c/adb2c.module';
import { UsersRepositoryModule } from '../../repositories/users/users.repository.module'; import { UsersRepositoryModule } from '../../repositories/users/users.repository.module';
import { AuthController } from './auth.controller'; import { AuthController } from './auth.controller';
import { AuthService } from './auth.service'; import { AuthService } from './auth.service';
import { TermsRepositoryModule } from '../../repositories/terms/terms.repository.module'; import { RedisService } from '../../gateways/redis/redis.service';
@Module({ @Module({
imports: [ imports: [ConfigModule, AdB2cModule, UsersRepositoryModule],
ConfigModule,
AdB2cModule,
UsersRepositoryModule,
TermsRepositoryModule,
],
controllers: [AuthController], controllers: [AuthController],
providers: [AuthService], providers: [AuthService, RedisService],
}) })
export class AuthModule {} export class AuthModule {}