Files
doodle-store/apps/server/src/auth/auth.module.ts
T

49 lines
2.0 KiB
TypeScript

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { JwtModule } from '@nestjs/jwt';
import { ACCOUNT_READER } from './account-reader';
import { AccessTokenGuard } from './access-token.guard';
import { JwtTokenService } from './jwt-token.service';
import { DatabaseModule } from '../database/database.module';
import { AccountRepository } from './account.repository';
import {
WECHAT_FETCH,
WECHAT_DIAGNOSTICS,
WechatClient,
type WechatDiagnostics,
} from './wechat-client';
import { SERVER_CONFIG, type ServerConfig } from '../config/server-config';
import { AppLogger } from '../logging/app-logger';
import { LoginRateLimiter } from './login-rate-limiter';
import { LoginService } from './login.service';
import { LoginController } from './login.controller';
import { CurrentUserController } from './current-user.controller';
@Module({
// 签名和验证参数由 JwtTokenService 统一提供,避免不同调用点使用不同策略。
imports: [JwtModule.register({}), DatabaseModule],
controllers: [LoginController, CurrentUserController],
providers: [
JwtTokenService,
AccountRepository,
{ provide: ACCOUNT_READER, useExisting: AccountRepository },
{ provide: WECHAT_FETCH, useValue: fetch },
{
provide: WECHAT_DIAGNOSTICS,
inject: [SERVER_CONFIG],
useFactory: (config: ServerConfig): WechatDiagnostics => {
const logger = new AppLogger(config.logLevel);
return (entry) => logger.warn('wechat_exchange_failed', entry);
},
},
WechatClient,
LoginRateLimiter,
LoginService,
// 注册为全局守卫,新路由默认受保护,无需逐个添加 @UseGuards。
{ provide: APP_GUARD, useClass: AccessTokenGuard },
],
exports: [JwtTokenService, ACCOUNT_READER, AccountRepository],
})
/** 微信静默登录、本人读取与全局鉴权;身份始终来自可信微信兑换或本站凭证。 */
export class AuthModule {}