本文主要列举在如今前后端分离、手机App大行其道的现状下,用户认证、授权的几种做法及对比。
PS. 本文假设你已经理解了各种认证模式的具体细节。
OAuth2.0是一个被广泛采用的事实标准,它同时包含认证和授权两种模式,我们来看一下它有几种模式:
Grant type | Client owner | User context? | Client type | App type |
---|---|---|---|---|
Authorization Code | Third-party | Y | confidential | Web app |
Authorization Code, without client secret | Third-party | Y | public | User-agent app |
Authorization Code, without client secret, with PKCE | Third-party | Y | public | Native app |
OAuth2 Implicit(deprecated) | Third-party | Y | public | User-agent app, Native app |
Password | First-party | Y | both | Web app, User-agent app, Native app |
Client Credentials | Third-party | N | confidential | Web app |
名词定义:
Client owner:
User context:
Client type:
App type:
Mode | Client belong | User Context | App type |
---|---|---|---|
Session | First-party | Y | Web app |
SSO | First-party | Y | Web app |
JWT | First-party | Y | Web app, User-agent app, Native app |
详细说明以上三种模式:
Session模式: 就是我们传统的Web app所使用的技术,用户输入账号和密码登录系统,服务端返回一个名字叫做SESSIONID
的Cookie
,之后User-agent和服务端每次交互都会携带这个Cookie
,通过这种方式来做到用户登录状态的保持。
SSO模式: 其实是Session模式的变种,只不过把认证从Session模式的本地认证变成了利用SSO服务器做认证。已知SSO类型有:CAS、SAML。
JWT模式: 它和Session模式的区别在于:
Cookie
携带,而是放在Header
里,这个信息我们叫做Token
。Token
里包含了加密的、不可篡改的当前登录用户的信息,SESSIONID
只是一个代号,是没有这个信息的。Token
里已经存在,再也不需要维护Session了。JWT模式可以使用SSO吗?答案是可以的,但是有条件,在SSO认证流程的最后一步——获取用户信息——的通信必须是confidential的。
对于Web app来说只要它接入了SSO,获取用户信息的通信本来就是confidential的,它获得用户信息之后构造JWT并返回就可以了。
对于User-agent app和Native app来说,需要为它做一个中介Web app,这个Web app和SSO通信,然后构造JWT返回给User-agent app。