一、用户认证简介
用户认证:who are you, 在客户端系统中,用户进行功能操作的时候,当前系统需要知道当前登录人的相关信息,比如说天猫:用户再将商品添加到购物车的时候,需要用户进行登录操作,获取用户信息。还有在用户下单的时候,也是需要知道当前用户的相关信息的。
用户认证就是:让用户进行登录操作,从而获取到用户的相关信息。
对于客户端系统来说。登录操作可以分为:单点登录,第三方账号登录
下面流程图描述了用户要操作的各个微服务,用户查看个人信息需要访问客户微服务,下单需要访问订单微服务,秒杀抢购商品需要访问秒杀微服务。每个服务都需要认证用户的身份,身份认证成功后,需要识别用户的角色然后授权访问对应的功能。
1.1 单点登录
用户访问的项目中,至少有3个微服务需要识别用户身份,如果用户访问每个微服务都登录一次就太麻烦了,为了提高用户的体验,我们需要实现让用户在一个系统中登录,其他任意受信任的系统都可以访问,这个功能就叫单点登录。
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
单点登录即:一处登录,处处登录。对于客户端系统来说,他内部存在很多子系统,比方说当前的首页系统,搜索系统,商品详情页系统,订单系统等等。用户只要在其中某一个系统登录成功之后,那么同时的其他子系统也会处于当前的登录状态,这就是所谓的单点登录。
基于单点登录延伸出了第三方登录,因为在传统的登录操作中,用户需要在本系统内部进行注册,然后基于注册的用户名和密码完成登录操作。但是现在大多数人都有,像微信、QQ、微博这些账号,为了方便用户进行操作。当前系统也会允许用户不用本系统的账号密码进行登录。
而是通过第三方的,像微信、微博、QQ的这些账号信息来完成我们当前本系统的登录,从而方便了用户的访问这就是第三方登录。
1.2 第三方账号登录
随着国内及国外巨头们的平台开放战略以及移动互联网的发展,第三方登录已经不是一个陌生的产品设计概念了。 所谓的第三方登录,是说基于用户在第三方平台上已有的账号和密码来快速完成己方应用的登录或者注册的功能。而这里的第三方平台,一般是已经拥有大量用户的平台,国外的比如Facebook,Twitter等,国内的比如微博、微信、QQ等。
二、认证技术解决方案
2.1 单点登录技术方案
我们要在分布式系统中实现单点登录,我们一般都会单独搭建一个用户认证系统,并且将用户相关的身份信息存储在单独的存储介质中,一般都会选择使用Redis
单点登录功能实现流程图:
单点登录功能实现流程:
客户端发起请求,首先会进入到我们的网关,然后由网关将用户请求转发到具体某一个服务上,对于服务来说,他们如果要进行用户认证的话都会来找到当前的认证系统,在认证系统中完成用户信息的认证。对于认证系统来说,它现在需要来获取以及存储 用户的相关信息,它就会把这些信息来存放到当前的Redis中。这就是实现单点登录的实现思路。
Java中有很多用户认证的框架都可以实现单点登录:
1、Apache Shiro.
2、CAS 耶鲁大学提供的
3、Spring security spring提供的
2.2 第三方登录技术方案
2.2.1 Oauth2认证流程
第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的 接口协议。
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认 证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。互联网很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。 Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
参考:https://baike.baidu.com/item/oAuth/7153134?fr=aladdin
Oauth协议:https://tools.ietf.org/html/rfc6749
下边分析一个Oauth2认证的例子,网站使用微信认证的过程:
1.客户端请求第三方授权
用户进入论坛的登录页面,点击微信的图标以微信账号登录系统,用户是自己在微信里信息的资源拥有者。
点击“用QQ账号登录”出现一个二维码,此时用户扫描二维码,开始给论坛网站授权。
2.资源拥有者同意给客户端授权
资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证, 验证通过后,QQ会询问用户是否给授权论坛网站访问自己的QQ数据,用户点击“确认登录”表示同意授权,QQ认证服务器会 颁发一个授权码,并重定向到论坛网站的网站。
3.客户端获取到授权码,请求认证服务器申请令牌 此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。
4.认证服务器向客户端响应令牌 认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。 此交互过程用户看不到,当客户端拿到令牌后,用户在论坛网站看到已经登录成功。
5.客户端请求资源服务器的资源 客户端携带令牌访问资源服务器的资源。 论坛网站携带令牌请求访问微信服务器获取用户的基本信息。
6.资源服务器返回受保护资源 资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。 注意:资源服务器和认证服务器可以是一个服务也可以分开的服务,如果是分开的服务资源服务器通常要请求认证 服务器来校验令牌的合法性。
Oauth2.0认证流程如下:
引自Oauth2.0协议rfc6749 https://tools.ietf.org/html/rfc6749
Oauth2包括以下角色:
1、客户端 本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:畅购Android客户端、畅购Web客户端(浏览器端)、微信客户端等。
2、资源拥有者 通常为用户,也可以是应用程序,即该资源的拥有者。
3、授权服务器(也称认证服务器) 用来对资源拥有的身份进行认证、对访问资源进行授权。客户端要想访问资源需要通过认证服务器由资源拥有者授 权后方可访问。
4、资源服务器 存储资源的服务器,比如,畅购用户管理服务器存储了畅购的用户信息,微信的资源服务存储了微信的用户信息等。客户端最终访问资源服务器获取资源信息。
2.2.2 Oauth2在项目的应用
Oauth2是一个标准的开放的授权协议,应用程序可以根据自己的要求去使用Oauth2,项目中使用Oauth2可以实现实现如下功能:
1、本系统访问第三方系统的资源
2、外部系统访问本系统的资源
3、本系统前端(客户端) 访问本系统后端微服务的资源。
4、本系统微服务之间访问资源,例如:微服务A访问微服务B的资源,B访问A的资源。