前言
上篇文章搭建好了我们的微服务系统框架,今天我们来把用户认证加上。
用户认证流程
首先,我们添加一个 User Server 的微服务,则我们的架构演变成这样:
我们使用 JWT 来进行用户认证,首先是登录过程。
登录过程
登录过程很简单,如下所示:
用户在 Client 输入账号和密码,BFF 层负责转发到 User Server,User Server 返回 token 给 BFF,BFF 再转发给 Client 即可。
之后,Client 的请求都需要带上 token 来进行认证
认证过程
认证过程步骤相对要多一点,比如现在要获取某个用户下的某个订单,则 BFF 需要先调用 User Server 来进行认证,如果成功会返回用户信息,然后再连同订单 ID 一起传递给 Order Server 获取订单:
如果认证失败,则 BFF 直接返回错误:
接下来,看看关键部分的代码是怎么实现的。
关键代码
在 Nest.js 中,用户认证一般可以通过 Guard
来实现,比如上面的功能就可以写成这样:
1 | export class JwtAuthGuard implements CanActivate { |
在 Order Server 的 resolver
中可以像这样来使用:
1 | () => Order) ( |
其中,CurrentUser
是自定义的一个装饰器,当认证成功时从 request
里面获取 user
:
1 | import {createParamDecorator, ExecutionContext} from '@nestjs/common' |
接下来,我们来看看客户端要怎么做。
首先,我们开发一个登录的页面:
1 | function Login() { |
这里使用的是 GraphQL 中的 mutation
来进行登录,则 User Server 中的 resolver
也要改一下:
1 | @Mutation(() => String) |
登录完成后,我们把 token
存在 localStorage
中。接下来要做的就是让请求的时候头部带上这个 token
,这个通过 @apollo/client
的 link
来实现:
1 | const httpLink = createHttpLink({ |
到此,用户认证就基本完成了,完整代码见这里。