雖然TypORM還有transaction及migration可以繼續try,但繼續這樣下去就快要變成TypeORM鐵人30天....
還是拉回來nestjs framework本身,接下來到鐵人賽結束打算讀
今天就先來分享Passport,他提供基本的bearer、jwt及oauth第三方登入,只要安裝不同的Strategy,官網上Strategies頁面也可以搜尋
如:
在開始之前,我把到目前的code做一些refactor,這樣code比較乾淨一點
做refactor過程中十分流暢,大部分都是從app.controller copy&paste,除了import路徑修正外,幾乎不用做什麼變更
建立module建議用@nest/cli會建立資料夾、檔案及自動import AppModule
nest g module moduleName
流程大致如下:
先用已知bearer token來理解Passport的運作,
安裝相關套件
yarn add @nestjs/passport passport passport-http-bearer
nest g mo auth
在auth資料夾下新增auth.service.ts
@Injectable()
export class AuthService {
constructor(
// 注入機UsersService,所以需要import UsersModule
// 底下的provider才能被注入
private readonly usersService: UsersService,
) {}
async validateUser(token: string): Promise<any> {
// 先假定token已知,由userService回傳使用者資料
// 如果token不正確則回傳null
return await this.usersService.findOneByToken(token);
}
}
修改user.service.ts
...
async findOneByToken(token){
// 假定token為ironNest
if (token === 'ironNest')
return this.getUserById(10);
else
return null;
}
...
到auth資料夾下新增passport資料夾
在passport資料夾新增bearer資料夾及jwt資料夾(明天要用)
新增http.strategy.ts
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from 'auth/auth.service';
import {PassportStrategy} from '@nestjs/passport';
import {Strategy} from 'passport-http-bearer';
@Injectable()
// 要繼承@nest/passport下的PassportStrategy並傳入passport
// 本日是以http bearer為例
export class HttpStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService){
super();
}
async validate(token: string){
const user = await this.authService.validateUser(token);
if( !user){ // 如果用token找不到使用者,就丟unauthorized exception
return new UnauthorizedException();
}
return user; // 有找到使用者,passport會把user物件存在req中
}
}
auth.module.ts
@Module({
imports: [
UserModule,
],
providers: [
AuthService,
HttpStrategy,
],
})
export class AuthModule {}
修改users.controller.ts
import { AuthGuard } from '@nestjs/passport';
// UseGuards()傳入@nest/passport下的AuthGuard,並指定用bearer驗證
@UseGuards(AuthGuard('bearer'))
@Controller('users')
export class UsersController {
...
}
顯示401 Unauthoized
在authorization指定bearer token
可以顯示users資訊
明天來討論JWT