百度上搜索“单点登录和OAth2.0”、“OAuth2.0实现单点登录”,可以搜出很多结果,这些结果有图有代码,还有详细案例。但是这些结果没有原理层面来解释“OAth2.0和单点登录”。当然这些结果都解释了“OAth2.0的4种授权模式”,但和“登录”有关系吗?
首先需要区分一下“授权”和“认证”:
“认证”Authentication也就登录的过程,即识别你是谁。
“授权”Authorization,即据据用户身份授予他访问特定资源的权限。
而OAuth2.0 只是一种“授权”,本身不具“认证”功能。那么问题来了,OAuth2.0如何与登录“扯”上关系了?所谓的“OAuth2.0实现单点登录”难道是胡扯??
经过查资料,发现真正实现“认证”(或者“登录”)的是OIDC(全称OpenID Connect)协议,而OIDC基于OAuth2.0扩展出来的一个协议。
OIDC与OAuth2.0相比,引入了id_token等和userinfo相关的概念:
1、OAuth2协议,只是定义了access_token/refresh_token,但这两个token只是为了保护Resource Server的,并没有Resource Owner的身份信息。
2、OIDC引入了id_token的概念,用这个特殊的token来表示Resouce Owner的身份信息。
3、OIDC协议的登陆授权过程流程和OAth2.0类似,整个过程的参与者也类似。
OIDC引出的概念还有很多,这里暂不做扩展。
总之,因为OIDC是OAuth2.0的扩展,很多实现OAuth2.0的产品也直接实现了OIDC。只不过OIDC经常被遗忘。
OAuth2.0并没有直接实现SSO,准确的是应该是OAuth2.0实现了OIDC,OIDC再实现SSO。这就好比,“质子、电子、中子”组成了“原子”,“原子”再组成了“分子”。如果说“OAth2.0实现了单点登录”,就好比说“质子、电子、中子组成分子”一样有问题。因为中间缺少了一个抽象层级。