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:
parent
e228d06cc7
commit
35923f84e2
@ -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}
|
||||||
|
|||||||
@ -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に変換"
|
||||||
|
|||||||
@ -1 +1,3 @@
|
|||||||
export const ADB2C_PREFIX = 'adb2c-external-id:';
|
export const ADB2C_PREFIX = 'adb2c-external-id:';
|
||||||
|
|
||||||
|
export const IDTOKEN_PREFIX = 'id-token:';
|
||||||
|
|||||||
11
dictation_server/src/common/cache/index.ts
vendored
11
dictation_server/src/common/cache/index.ts
vendored
@ -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}`;
|
||||||
|
};
|
||||||
|
|||||||
@ -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) => {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user