这一章主要讲Passport,他提供基本的bearer、jwt及oauth第三方登入,只要安装不同的Strategy,官网上Strategies页面也可以搜寻
如:
建立module建议用@nest/cli会建立资料夹、档案及自动import AppModule
在feature文件下新建auth文件夹,然后在在auth文件下,用@nest/cli建立module
nest g module moduleName
流程大致如下:
- 建立AuthModule
- 用来统一存放关于Auth的component
- 建立AuthService
- 写验证使用者的逻辑、issue token等
- 新增UserService验证方法
- 建立HttpStrategy
- 告诉Passort Module怎么验证使用者,通常是呼叫auth service里面的方法
- 在AuthModule下的provider注册AuthService及HttpStrategy
- import UserModule
- 需要存取使用者资讯,验证帐号密码等
- 到要保护的Controller或handler method套上@UseGuards()
- 测试
先用已知bearer token来理解Passport的运作,
安装相关套件
yarn add @nestjs/passport passport passport-http-bearer
新增AuthModule
import { Module } from '@nestjs/common';
@Module({})
export class AuthModule {}
新增AuthService
在auth资料夹下新增auth.service.ts
import { Injectable } from '@nestjs/common';
import { UserService } from 'feature/user/user.service';
@Injectable()
export class AuthService {
constructor(
// 注入UsersService,所以需要import UsersModule
// 底下的provider才能被注入
private readonly usersService: UserService,
) {}
async validateUser(token: string): Promise<any> {
// 先假定token已知,由userService回传使用者资料
// 如果token不正确则回传null
return await this.usersService.findOneByToken(token);
}
}
新增使用者验证方法
修改user.service.ts
...
async findOneByToken(token){
// 假定token为geekjc
if (token === 'geekjc')
return this.getUserById(8);
else
return null;
}
...
新增HttpStrategy
到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中
}
}
在AuthModule注册provider
@Module({
imports: [
UserModule,
],
providers: [
AuthService,
HttpStrategy,
],
})
export class AuthModule {}
到User controller套用@UseGuards()
修改users.controller.ts
import { AuthGuard } from '@nestjs/passport';
// UseGuards()传入@nest/passport下的AuthGuard,并指定用bearer验证
@UseGuards(AuthGuard('bearer'))
@Controller('users')
export class UsersController {
...
}
使用postman测试
2018111602.png
显示401 Unauthoized
在authorization指定bearer token
2018111603.png可以显示users资料
下一章讲JWT
tuiguang.png推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。
网友评论