根据URL路径来区分不同服务也是最常见的微服务设计方案。由于域名统一,不同服务可以通过Cookie来共享身份认证标志。这时可以直接集成认证授权服务到API Gateway中。后端服务无需再进行分别验证。
微服务系统同样也需要单点登录的模块,本文介绍下微服务架构的web应用如何实现单点登录。
子系统域名相同
对于域名相同的多个服务,要实现单点登录是最容易的。根据URL路径来区分不同服务也是最常见的微服务设计方案。由于域名统一,不同服务可以通过Cookie来共享身份认证标志。这时可以直接集成认证授权服务到API Gateway中。后端服务无需再进行分别验证。
根据路径区分服务的微服务架构
另外一种比较常见的微服务架构,子系统使用不同的二级域名,而一级域名相同。比如系统A的域名为A.example.com,系统B的域名为B.example.com。
根据二级域名区分子系统的微服务架构
对于这种情况,不同系统同样可以通过Cookie来共享身份认证标志。这时也可以直接集成认证授权服务到API Gateway中,后端服务无需再分别进行验证。
子系统域名不同
微服务架构中不同的服务使用不同的一级域名,这种情况不多见,一般比较大型的公司会有这种可能。域名不同就意味着不能通过共享Cookie方式来标志身份认证,因此处理起来要复杂一些。
不同域名的服务,可以理解为相互独立的系统了,前面介绍过的单点登录CAS、OAuth2都可以派上用场。下面我们列举几种解决方案。
CAS方案
基于CAS方案的微服务单点登录
CAS单点登录过程:
- 请求资源
- 重定向到CAS认证中心
- 在登录页面提交登录信息,验证通过,生成登录凭证ticket
- 向服务端再次请求资源并带有ticket
- 服务端在认证中心验证ticket,验证通过,服务端创建cookie
- 带sessionId请求资源,获得返回内容
客户端向其他服务端请求时,会再次重定向到认证中心,此时不需要再提交登录信息,可以返回ticket。利用ticket,按照4-6步骤可以向服务端顺利请求资源。
OAuth方案
基于OAuth2方案的微服务单点登录
OAuth2单点登录过程:
- 客户端向服务端请求资源
- 重定向到OAuth Server
- 在登录页面提交登录信息,验证通过,取得授权码
- 再次向服务端请求资源并带有授权码
- 服务端在Oauth Server获取token
- 服务端返回数据。
当客户端向其他服务端请求时,同样带上授权码。服务端按照4-6步骤可以在Oauth Server获得token后,可以向浏览器返回数据。
Kisso方案
Kisso是一个基于 Cookie 的 SSO 中间件,也常用于单点登录。
Kisso单点登录过程:
- 向服务端请求登录
- 重定向到Kisso Server
- 在登录页面提交登录信息,验证通过
- 向服务端再次请求登录
- 服务端向Kisso Server确认已登录,创建cookie
- 请求页面内容,服务端返回页面内容。
向其他服务端请求时,先请求登录,用户不需要重复提交登录信息,服务端会向Kisso Server确认已登录。服务端之后可以向浏览器返回数据。
方案对比
子系统域名相同的微服务架构,认证授权可以放在网关,后端可以做到无侵入。子系统域名不同的架构,上述三种方案,后端都不能做到无侵入,认证授权服务无法集成在网关中。不过也不是绝对的,我们仍然可以自定义方案来实现网关集中认证授权。
自定义方案
自定义方案:
- 请求网关登录
- 网关返回登录页面,提交账号和密码,登录成功后返回jwtToken
- 验证通过后重定向到内容页面,并带有jwtToken
- 网关验证通过后转发到后端服务
- 后端服务返回内容
如果访问其他服务,同样由网关验证jwtToken,验证通过后由网关转发给对应的后端服务。
这种方案也可以做到后端无侵入,不过对API网关的要求比较高,因为所有请求都需要网关来做转发,网关的负载会比较大。
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/tech/25627.html