美文网首页让前端飞Web前端之路
Nest.js学习之路(24)-Http Bearer Toke

Nest.js学习之路(24)-Http Bearer Toke

作者: cbw100 | 来源:发表于2019-07-20 01:08 被阅读3次

    这一章主要讲Passport,他提供基本的bearer、jwt及oauth第三方登入,只要安装不同的Strategy,官网上Strategies页面也可以搜寻

    如:

    建立module建议用@nest/cli会建立资料夹、档案及自动import AppModule

    在feature文件下新建auth文件夹,然后在在auth文件下,用@nest/cli建立module

    nest g module moduleName
    

    流程大致如下:

    1. 建立AuthModule
      • 用来统一存放关于Auth的component
    2. 建立AuthService
      • 写验证使用者的逻辑、issue token等
    3. 新增UserService验证方法
    4. 建立HttpStrategy
      • 告诉Passort Module怎么验证使用者,通常是呼叫auth service里面的方法
    5. 在AuthModule下的provider注册AuthService及HttpStrategy
    6. import UserModule
      • 需要存取使用者资讯,验证帐号密码等
    7. 到要保护的Controller或handler method套上@UseGuards()
    8. 测试

    先用已知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

    推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

    tuiguang.png

    相关文章

      网友评论

        本文标题:Nest.js学习之路(24)-Http Bearer Toke

        本文链接:https://www.haomeiwen.com/subject/eoupfqtx.html