功能说明:
- client端使用用户名和用户密码登录,登录成功后server端发送JWT;
- client在header中携带JWT访问server,server端对client端携带的JWT进行认证;
初始化项目
创建项目并初始化User,Auth模块,terminal执行:
1 | sql复制代码 # 新建nestjs工程: auth-jwt |
工程结构:
1 | java复制代码├── nest-cli.json |
User Module
- 通过用户名获取用户;
- 获取用户列表;
- 导出 User Service以便Auth Service引用;
user.entity.ts:
1 | typescript复制代码export interface UserEntity { |
user.service.ts:
1 | typescripy复制代码import { Injectable } from '@nestjs/common'; |
user.controller.ts:
1 | typescript复制代码import { Controller, Get } from '@nestjs/common'; |
User Module中导出UserService,user.module.ts
1 | typescript复制代码import { Module } from '@nestjs/common'; |
Auth Module,实现用户登录
安装登录认证所需依赖passport, passport-local, @nestjs/passport, @types/passport-local, terminal中执行:
1 | bash复制代码npm i passport passport-local @nestjs/passport |
账户、密码认证策略实现
AuthService实现用户身份认证
auth.service.ts,用户名密码验证:
1 | typescript复制代码import { Injectable } from '@nestjs/common'; |
LocalStrategy,实现账户、密码认证策略。
auth目录下新建local.strategy.ts:
1 | typescript复制代码import { PassportStrategy } from '@nestjs/passport'; |
validate方法为默认的用户身份认证的实现,passport-local守卫将自动调用。
用户登录API
AuthController中实现login API,使用passport-local守卫。
auth.controller.ts:
1 | typescript复制代码import { Controller, Post, Request, UseGuards } from '@nestjs/common'; |
@UseGuards(AuthGuard('local'))
守卫将从body中提取username、password,然后调用LocalStrategy中的validate方法,若认证通过,则将User信息赋值给request.user。
auth.module.ts:
1 | typescript复制代码import { Module } from '@nestjs/common'; |
npm run start
启动服务,使用POST请求访问http://127.0.0.1:3000/auth/login
,若用户名、密码正确,则获得用户信息,否则response code为401。curl命令如下:
1 | bash复制代码curl -X POST http://127.0.0.1:3000/auth/login -d '{"username": "admin", "password": "123456"}' -H "Content-Type: application/json" |
JWT Strategy实现
至此,使用Local Strategy用户认证守卫完成了用户登录功能.现在我们来实现:
- 当用户登录成功后下发access_token;
- User List服务使用jwt认证。
安装依赖
terminal执行:
npm i passport-jwt @nestjs/jwt
npm i @types/passport-jwt -D
重写login,登录成功下发access_token
auth.service.ts添加login方法:
1 | typescript复制代码import { Injectable } from '@nestjs/common'; |
auth.controller.ts:
1 | typescript复制代码import { Controller, Post, Request, UseGuards } from '@nestjs/common'; |
AuthModule 中注册 JwtModule
auth目录下新建jwt.contants.ts:
1 | typescript复制代码export const jwtContants = { |
注册JwtModule,auth.module.ts:
1 | typescript复制代码import { Module } from '@nestjs/common'; |
启动服务,访问登录服务,认证通过后将返回token:
1 | erlang复制代码curl -X POST http://127.0.0.1:3000/auth/login -d '{"username": "admin", "password": "admin"}' -H "Content-Type: application/json" |
JWT access_token认证
auth下新建jwt.strategy.ts:
1 | typescript复制代码import { Injectable } from '@nestjs/common'; |
auth.module.ts:
1 | typescript复制代码import { Module } from '@nestjs/common'; |
user.controller.ts 添加jwt认证守卫:
1 | typescript复制代码import { Controller, Get, UseGuards } from '@nestjs/common'; |
启动服务,访问http://127.0.0.1:3000/user,token认证通过将获得用户列表:
1 | bash复制代码curl http://127.0.0.1:3000/user -H "token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwic3ViIjoxLCJpYXQiOjE2MDYxODA4MjR9.y9xt_rn6nORS5MEU18MeNB0brnGHvZLxe7sAYNkz0KY" |
- demo工程源码 github.com/louie-001/n…
- NestJS 官方nestjs.com/。
本文转载自: 掘金