此次借着要做SSO单点登录功能,学习了IdentityServer4(下称Id4)这个中间件,花了不少时间,网络上资料也很多,同时也五花八门,主要是Id4功能也太多。
对于初次接触者来说,在理解上有一定的难度。所以下面我也整理了一部分学习心得,很适合初学者。跟着这个节奏,能快速理解和达到SSO功能。当然,若是描述有不正确的地方,也欢迎批评指正。
学习Id4,就必须了解2个东西,OpenId和Oauth2.0,这两个都是协议,并没有具体实现。
Openid:简单的理解就是身份认证,识别用户是谁?同一个用户OpenId一致,就能确保在不同的应用中,保持一致的登录信息。最容易理解的就是微信。
OAuth2.0:授权,用户能做什么?
这两个是不一样的作用。而Id4呢,就是集成了这两个协议的具体实现,是一个具体实现身份认证和身份授权协议的中间件。
关于Oauth2.0,大家可一从参考这篇文章:https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 讲得很详细。
在整个Id4实现过程中,涉及的主角应该是3个
1:Identity身份认证服务端:主要提供验证用户身份和授权验证,判断用户是否登录,是否有权限访问资源。
2:Api资源:即客户端需要请求的Api资源站点,比如某个站点的接口,但是api这边必须判断这个客户端是否有权限能请求。
3:Client客户端:即发起请求的端,比如某个子站点需要登录,就需要跳转到身份认证服务端去进行登录,登录完成后再回来,同时获取登录用户信息。亦如需要访问Api资源,但是需要先请求身份认证服务端,获得授权token,再带着token去请求api资源接口。
关于授权,
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
Id4也是基于这4种模式进行实现,其模式有以下几种:
1、客户端模式 ( Client credentials):和用户无关,用于应用程序与API资源的直接交互场景。切记,客户端模式,仅用于获取token,请求api资源,无法获取用户信息。
2、密码模式resource owner password credentials):适用于当前的APP是专门为某用户设定的,资源所有者和客户端应用之间必须高度信任,其它授权方式不可用的时候才用,尽量不用。密码模式适用于通过传递用户名和密码,请求登录接口的应用。这个应该必须是信任的,不然就很危险,会导致用户名和密码被窃取。
3、简化模式( implicit flow):适用于浏览器WB应用, Javascripυt支持;简化模式下 ID Token和 Access token都是通过浏览器的前端通道传递的,所以如果是传统服务端Web应用并且仅是在服务端使用Access token的话,推荐使用 Hybrid flow。
4、授权码模式( Authorization code flow): 授权码模式通过后台传输 Tokens,相对于简化模式会更安全一点.会对用户和客户端都进行身份认证,用于实现第三方登录, Authorization code通过后台传到客户端。
5、混合模式( Hybrid flow):适用于服务器端Web应用程序和原生桌面/移动应用程序。混合模式是简化模式和授权码模式的组合。混合模式下 Id Token通过浏览器的前端通道传递,而 AccesToken和 Refresh token通过后端通道取得。
6、简化模式- With OpenID( implicit grant type):仅限OpenID认证服务,用于第三方用户登录及获取用户信息,不包含授权。SSO单点登录适用。
7、简化模式-With0 eniD&0Auth(Js客户端调用):包含0 eniD认证服务和 OAuth授权,但只针对JS调用(URL参数获取),一般用于前端或无线端。
8、混合模式- With OpenID& OAuth( Hybrid flow):推荐使用,包含0 penD认证服务和 OAuth授权,但针对的是后端服务调用。
后面我们讲述的示例,也是按照这几种方式进行。