Generating JWT

김종민·2022년 6월 27일
0

Nuber-Server

목록 보기
8/34

들어가기
jsonwebtoken을 이용해서 토큰을 만들어본다

npm i jsonwebtoken
npm i @types/jsonwebtoken --only-dev

import * as jwt from 'jsonwebtoken

https://www.npmjs.com/package/jsonwebtoken

1. app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
      ignoreEnvFile: process.env.NODE_ENV === 'prod',
      validationSchema: Joi.object({
        NODE_ENV: Joi.string().valid('dev', 'prod').required(),
        DB_HOST: Joi.string().required(),
        DB_PORT: Joi.string().required(),
        DB_USERNAME: Joi.string().required(),
        DB_PASSWORD: Joi.string().required(),
        DB_NAME: Joi.string().required(),
        PRIVATE_KEY: Joi.string().required(), <-------
      }),
    }),

app.module.ts의 ConfigModule안아 PRIVATE_KEY를 넣어준다.

2. .env.dev

PRIVATE_KEY를 설정한다. 아무거나 닥치는대로 적으면 된다.

3. users.module.ts

import { Module } from '@nestjs/common';
import { UserResolver } from './users.resolver';
import { UserService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { ConfigService } from '@nestjs/config';

@Module({
  imports: [TypeOrmModule.forFeature([User]), ConfigService], 
  ///원래는 imports에 ConfigService를 넣어주어야한다.
  ///UserModule에서 ConfigModule 사용을 위해서
  ///하지만 app.module.ts에서 ConfigModule에 isGlobal:true
  ///를 넣어주면, imports에 않넣어줘도 된다.
  
  providers: [UserResolver, UserService],
  exports: [UserService],
})
export class UsersModule {}

4.app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,  ///다른 모듈에서 사용할때, imports안해도 됨.
                      ///isGlobal:true 는 전역변수
      
      envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
      ignoreEnvFile: process.env.NODE_ENV === 'prod',
      validationSchema: Joi.object({
        NODE_ENV: Joi.string().valid('dev', 'prod').required(),
        DB_HOST: Joi.string().required(),
        DB_PORT: Joi.string().required(),
        DB_USERNAME: Joi.string().required(),
        DB_PASSWORD: Joi.string().required(),
        DB_NAME: Joi.string().required(),
        PRIVATE_KEY: Joi.string().required(),
      }),
    }),
    

5. user.service.ts

 
@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User) private readonly users: Repository<User>,
    private readonly config: ConfigService,
    private readonly jwtService: JwtService,
  ) {}

혹은, user.service.ts에서 configModule을 사용하고자 한다면,
constructor에서 config: ConfigService를 불러준다.
그리고 나서

  async login({
    email,
    password,
  }: LoginInput): Promise<{ ok: boolean; error?: string; token?: string }> {
    try {
      const user = await this.users.findOneBy({ email });
      if (!user) {
        return {
          ok: false,
          error: 'User not found',
        };
      }
      const passwordCorrect = await user.checkPassword(password);
      if (!passwordCorrect) {
        return {
          ok: false,
          error: 'Wrong password',
        };
      }
      // const token = jwt.sign({ id: user.id }, this.config.get('PRIVATE_KEY'));
      ///JWT모듈을 사용하지 않을꺼면, 위와 같이 token을 만들어서 return시키면 된다.
      ///하지만, JWT모듈을 만들어서 token을 발급할 예정이라 위에 // 을 그어놓은것임.
      
      const token = this.jwtService.sign({ id: user.id });
      return {
        ok: true,
        token,
      };~~~~
profile
코딩하는초딩쌤

0개의 댓글