inflearn logo
강의

講義

知識共有

Slackクローンコーディング[バックエンド with NestJS + TypeORM]

local serializer, guard

user 세션 serialize 문제 질문

438

nak512

投稿した質問数 5

0

[Nest] 25160  - 2021. 09. 28. 오후 10:32:34   ERROR [ExceptionsHandler] Failed to serialize user into session

강의보는 도중에 나왔던 동일한 에러가 나와서 동일한 방법으로, auth.service.ts 파일에 validateUser() 에서 select에 'id'를 추가 하였습니다.


그렇게 했는데도 동일한 에러가 발생해서 user 값을 제대로 받아오는지 확인 하기 위해 console.log를 통해 확인해본 결과 정상적으로 select 한 값들(id, email, password, nickname)을 받아온 것을 확인하였습니다.

그래서 serializer가 제대로 등록되지 않았나 확인하기 위해
github에 있는 sleact를 다운받아

auth 폴더의
< auth.module.ts, auth.service.ts, local-auth.guard.ts, localserializer.ts, local.strategy.ts>

app.modules.ts
app.service.ts
main.ts 
등을 확인하고 serialize가 들어 가는 내용을 검색해 보았으나 모두 동일하게 등록되어 있음을 확인하였습니다.

이 상황에서 제가 어느 부분을 중점적으로 살펴 보아야 할지 감이 오지 않아 여쭤보게되었습니다.
에러 문구 : 

[Nest] 25160  - 2021. 09. 28. 오후 10:32:34   ERROR [ExceptionsHandler] Failed to serialize user into session

Error: Failed to serialize user into session

    at pass (D:\Slack\nest\dist\main.js:14933:19)

    at Authenticator.serializeUser (D:\Slack\nest\dist\main.js:14951:5)

    at SessionManager.logIn (D:\Slack\nest\dist\main.js:15239:8)      

    at IncomingMessage.req.login.req.logIn (D:\Slack\nest\node_modules\passport\lib\http\request.js:50:33)

    at D:\Slack\nest\dist\main.js:13559:64

    at new Promise (<anonymous>)

    at LocalAuthGuard.<anonymous> (D:\Slack\nest\dist\main.js:13559:23)

    at Generator.next (<anonymous>)

    at D:\Slack\nest\dist\main.js:13516:71

    at new Promise (<anonymous>)[Nest] 25160  - 2021. 09. 28. 오후 10:32:34   ERROR [ExceptionsHandler] Failed to serialize user into session

Error: Failed to serialize user into session

    at pass (D:\Slack\nest\dist\main.js:14933:19)

    at Authenticator.serializeUser (D:\Slack\nest\dist\main.js:14951:5)

    at SessionManager.logIn (D:\Slack\nest\dist\main.js:15239:8)      

    at IncomingMessage.req.login.req.logIn (D:\Slack\nest\node_modules\passport\lib\http\request.js:50:33)

    at D:\Slack\nest\dist\main.js:13559:64

    at new Promise (<anonymous>)

    at LocalAuthGuard.<anonymous> (D:\Slack\nest\dist\main.js:13559:23)

    at Generator.next (<anonymous>)

    at D:\Slack\nest\dist\main.js:13516:71

    at new Promise (<anonymous>)

-----------D:\Slack\nest\dist\main.js:14933:19)-------

Authenticator.prototype.serializeUser = function(fn, req, done) {
  if (typeof fn === 'function'{
    return this._serializers.push(fn);
  }
  
  // private implementation that traverses the chain of serializers, attempting
  // to serialize a user
  var user = fn;

  // For backwards compatibility
  if (typeof req === 'function'{
    done = req;
    req = undefined;
  }
  
  var stack = this._serializers;
  (function pass(i, err, obj) {
    // serializers use 'pass' as an error to skip processing
    if ('pass' === err{
      err = undefined;
    }
    // an error or serialized object was obtained, done
    if (err || obj || obj === 0{ return done(err, obj); }
    
    var layer = stack[i];
    if (!layer{
      return done(new Error('Failed to serialize user into session'));
    }
    
    
    function serialized(e, o) {
      pass(i + 1, e, o);
    }
    
    try {
      var arity = layer.length;
      if (arity == 3{
        layer(req, user, serialized);
      } else {
        layer(user, serialized);
      }
    } catch(e{
      return done(e);
    }
  })(0);
};

---------------------auth.service.ts -------------------

import { Injectable } from "../../node_modules/@nestjs/common";
import bcryptjs from '../../node_modules/bcryptjs'
import { Repository } from "typeorm";
import { Users } from "src/entities/Users";
import { InjectRepository } from "@nestjs/typeorm";


@Injectable()
export class AuthService {
    constructor(
        @InjectRepository (Usersprivate usersRepository: Repository<Users>,
        ) {}

    async validateUser(email: string, password: string){
        const user = await this.usersRepository.findOne({
            where: {email},
            select:['id', 'email', 'password', 'nickname'],
        })
        console.log(user);
        if(!user){           
            return null;
        }        
        
        const result = await bcryptjs.compare(password, user.password);
        console.log(result);
        if(result){
            const {password, ...userWithoutPassword} = user;
            return userWithoutPassword;
        }
        return null;
    }
}

nodejs express TypeORM NestJS

回答 2

0

nak512

안녕하세요, 제로초님.
답변 주셨는데도 불구하고 늦게 응답해서 죄송합니다.

말씀해주신, 
https://github.com/ZeroCho/sleact/blob/master/nest-typeorm/src/auth/local.serializer.ts#L18

위치에 있는console.log(user) 자체가 실행이 되지 않습니다.


---------------- auth.service.ts async validateUser 소스코드와 console.log ----------------------

 

    async validateUser(email: string, password: string){
        const user = await this.usersRepository.findOne({
            where: {email},
            select:['id', 'email', 'password', 'nickname'],
        })
        console.log(user);
        if(!user){           
            return null;
        }        
        
        const result = await bcryptjs.compare(password, user.password);
        console.log(result);
        if(result){
            const {password, ...userWithoutPassword} = user;
            return userWithoutPassword;
        }
        return null;
    }

 

query: SELECT `Users`.`id` AS `Users_id`, `Users`.`email` AS `Users_email`, `Users`.`nickname` AS `Users_nickname`, `Users`.`password` AS `Users_password` FROM `users` `Users` WHERE ( `Users`.`email` = ? ) AND ( `Users`.`deletedAt` IS NULL ) LIMIT 1 -- PARAMETERS: ["test5@naver.com"]

Users {

  id: 5,

  email: 'test5@naver.com',

  nickname: '테스트1',

  password: '$2a$12$RXFoHQTpSF05vaQ.USsP7e2M15C7Mi/HhY.eHhy.x/gHQx.J6WHTu'

}

true ---> user.password와 로그인을 위해 입력 받은 비밀번호 비교 값이 동일한지 비교한 결과 값(result)

---------------- local.strategy.ts ----------------- async validate
소스코드와 console.log 부분

  async validate(email: string, password: string, done: CallableFunction) {
    const user = await this.authService.validateUser(email, password);
    console.log('validate user', user);
    if (!user{
      throw new UnauthorizedException();
    }
    return done(null, user);
  }

validate user { id: 5, email: 'test5@naver.com', nickname: '테스트1' }

------------- local-auth.guard.ts ------------- 소스코드와 console.log 부분

@Injectable()
export class LocalAuthGuard extends AuthGuard('local'){
    async canActivate(context: ExecutionContext): Promise<boolean>{
        const can = await super.canActivate(context);
        if(can){
            const request = context.switchToHttp().getRequest();
            console.log('login for cookie');
            await super.logIn(request);
        }
        return true;
    }
}

login for cookie

위와 같이 출력됩니다.
위의 내용을 편집 없이 로그만 출력하면 아래와 같습니다.
--------------------- 시작 ---------------

query: SELECT `Users`.`id` AS `Users_id`, `Users`.`email` AS `Users_email`, `Users`.`nickname` AS `Users_nickname`, `Users`.`password` AS `Users_password` FROM `users` `Users` WHERE ( `Users`.`email` = ? ) AND ( `Users`.`deletedAt` IS NULL ) LIMIT 1 -- PARAMETERS: ["test5@naver.com"]

Users {

  id: 5,

  email: 'test5@naver.com',

  nickname: '테스트1',

  password: '$2a$12$RXFoHQTpSF05vaQ.USsP7e2M15C7Mi/HhY.eHhy.x/gHQx.J6WHTu'

}

true

validate user { id: 5, email: 'test5@naver.com', nickname: '테스트1' }

login for cookie

[Nest] 29836  - 2021. 09. 29. 오후 9:06:02   ERROR [ExceptionsHandler] Failed to serialize user into session

Error: Failed to serialize user into session

    at pass (D:\Slack\nest\dist\main.js:14934:19)

    at Authenticator.serializeUser (D:\Slack\nest\dist\main.js:14952:5)

    at SessionManager.logIn (D:\Slack\nest\dist\main.js:15240:8)

    at IncomingMessage.req.login.req.logIn (D:\Slack\nest\node_modules\passport\lib\http\request.js:50:33)

    at D:\Slack\nest\dist\main.js:13559:64

    at new Promise (<anonymous>)

    at LocalAuthGuard.<anonymous> (D:\Slack\nest\dist\main.js:13559:23)

    at Generator.next (<anonymous>)

    at D:\Slack\nest\dist\main.js:13516:71

  at new Promise (<anonymous>)

--------------------- 끝 ---------------
서버 구동 후 POSTMAN으로 로그인 을 시도하고 있는 상황입니다.

0

nak512

안녕하세요, 제로초님. 결국 해결하였습니다.
아무리 들여다 봐도 코드상에는 이상이 없어서, 관련 모듈들 모두 재설치를 진행하였습니다.
그랬더니 문제가 해결되었어요. 감사합니다.

0

zerocho

https://github.com/ZeroCho/sleact/blob/master/nest-typeorm/src/auth/local.serializer.ts#L18

여기에 console.log 찍은 건 어떻게 뜨시나요?

강의자료는 어디서 다운받나요?

0

110

3

질문 있습니다.

0

294

3

코드 편집기 확장 프로그램

0

209

2

(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?

0

143

2

(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문

0

166

3

로그인을 해도 LoggedInGuard쪽에서 false값이 나옵니다.

0

152

2

로그인방법이 고민됩니다.

0

190

2

yarn seed 명령어 실행 시 데이터 삽입 안됨

0

296

4

yarn run db:create 시에 발생하는 데코레이터 오류

0

242

2

npm run db:create 시에 발생하는 decorating 오류

0

231

2

RxJS 디버깅 질문 있습니다.

0

187

3

CacheManager에 대해 질문 있습니다.

0

173

2

로깅은 어떻게 하는게 효율적일까요?

0

224

1

CORS 질문 있습니다.

0

417

2

쿠키 옵션에 대해서 질문 있습니다.

0

184

2

로그아웃 요청이 403 forbidden 에러가 나는데 왜그런걸까요??

0

447

1

401 unauthorized문제

0

286

1

가드의 장점에 대해서 질문이 있습니다.

0

225

1

로그 관리에 대해 질문 있습니다.

0

252

2

CORS 에러 질문 있습니다.

0

318

2

배포 환경 DB 연결 질문 있습니다.

0

411

2

socket io 미 연결 문제 (nest & flutter)

1

1154

3

no elements in sequence 에러 관해서 질문이 있습니다.

0

454

1

start:dev-backup으로 돌리면 핫 리로딩이 되요 정상인가요?

0

322

1