如何在新微服务中对原有Laravel系统的已登录用户进行身份认证与授权?
新微服务身份认证与授权落地方案
方案1:基于Laravel已有Session共享实现(改造成本最低,适合快速上线)
- 前提:你的Laravel老系统和新微服务部署在同一个父域名下,比如老系统是
app.xxx.com,新微服务API是api.xxx.com,Session的Cookie域设置为.xxx.com根域名 - 操作步骤:
- 先修改Laravel的
config/session.php里的domain配置项为.你的根域名,确保Session Cookie能在所有子域名下携带 - 新React应用发起请求的时候自动带上根域名下的Cookie,新微服务侧做两个验证逻辑:
- 先读取请求携带的Session ID,去Laravel共用的Session存储(比如Redis/MySQL,和老系统连同一个实例)里查对应的用户ID是否存在、是否有效
- 再去共用的用户库里拉取用户的权限信息,完成授权校验
- 这种方式完全复用老系统的登录逻辑,用户无感知,不需要额外做登录跳转,上线最快
- 先修改Laravel的
- 注意点:如果新微服务不是PHP栈也没关系,只要能连到老系统的Session存储介质,按照Laravel 5.2的Session序列化规则解析就行,Laravel默认的Session序列化是PHP序列化格式,其他语言找对应的解析库就能读。
方案2:JWT Token对接方案(适合后续要扩展多端、微服务集群规模大的场景)
- 操作步骤:
- 老Laravel系统新增一个临时Token生成接口,用户从老系统跳转到React应用的时候,老系统后台根据当前登录的用户ID生成一个有效期极短(比如5分钟)的一次性JWT Token,跟着跳转参数传给React应用
- React应用拿到这个临时Token之后,调用新微服务的统一认证接口,用临时Token换有效期更长的业务访问Token(Access Token)和刷新Token(Refresh Token),后续所有业务请求都在Header里带
Authorization: Bearer {Access Token} - 新微服务侧统一做Token校验:可以直接用JWT的验签逻辑(签名秘钥和认证服务统一),如果是细粒度权限就对接共用的用户权限库拉取对应权限做校验
- 优势:完全解耦新老系统的认证逻辑,后续如果老系统下线、或者要做APP/小程序等其他端接入,不需要改微服务的认证逻辑,扩展性更强,也不需要跨域带Cookie,更适合微服务架构的后续迭代。
授权逻辑统一处理建议
- 因为用户库是共用的,建议把用户的角色、权限数据也存在共用的存储里,新老系统的权限规则保持一致,如果后续要做权限拆分再单独抽权限中心就行,前期不用搞太复杂的权限中心,避免增加不必要的开发成本。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

