对于刚开始接触身份认证的朋友对于单点登录,OAuth2.0,JWT 等等会有诸多疑惑,甚至还会问既然有了 JWT 还拿 单点登录做什么?还拿 OAuth2.0 做什么?
不知做过身份认证的 xdm 看到这里是不是感觉这句话有点迷??👀👀 他们有啥必然的关系吗,并没有
这篇文章旨在阐述 单点登录 ,OAuth2.0 以及 JWT 具体是个啥,其他的关联内容会简单提及,希望能够对你有帮助
✔单点登录是什么?
单点登录 英文翻译为 Single Sign On,简称就是SSO
他是一种思想,期望的是在多系统的应用中,只要在其中一个系统上进行登录,那么就可以直接访问其他任何一个互信的系统
简单来说就是,一次登录,多系统多次使用😁😁
✔为什么要使用单点登录?
自然是为了让用户能够更简单更高效更便捷的访问多个关联系统
其实通过这个简单有趣的思想,我们就可以知道,单点登录的由来,自然还是用户的需求驱动的
过去我们的系统比较少,每个系统都会去实现和维护一个登录认证模块,基本上是账号密码登录,手机短信验证码登录等等
可发展到现在,很多业务是关联多个子系统的,如果我们访问每一个子系统,都要完成一次认证,(例如每个系统都要我们输入账号密码) ,那么我们可能会疯掉,这种设计太反人类 😂😂
不过还是有一点好,就是我们可以把我们的密码记得更加牢固
因此,如果你是用户,你也期望,只用登录认证一次,我就可以访问其关联的所有系统,这样更加人性化
✔通用的单点登录实现方式有哪些
现在用的比较多的单点登录实现方式有如下四种,从实现方式从简单到复杂排序为
- JWT ( Json web token )基于 Token 的认证授权机制
- CAS (Central Authentication Service)中心授权服务
- OAuth2.0 (Open Authorization 2.0) 开放授权协议
- SAML (Security Assertion Markup Language) 安全断言标记语言
每一种协议都有自己的一个认证流程,思想都差不多,本篇文章重点聊聊 JWT 和 OAuth2.0
✔什么叫做认证,什么叫做授权?
首先,对于上述内容,一会儿认证,一会儿授权,到底有啥不一样??
对于看到 Authorization 这个单词,你认为是授权,还是认证?
看到 Authentication 这个单词,又是如何理解的呢?
认证 Authentication ,关注的是需要你证明你是谁,是一个证明自己身份的过程
👀例如咱们去参加演唱会,你如何证明你可以进去听?
是不是可以用你手上的票来证明你的身份,是一个给了钱买了票能听歌的人
这个时候,你过了演唱会的大门,进入到场子内,你会发现你这样的身份,只是被授权 Authorization 可以进入某些区域,另外的一些区域你是没有办法进入的
所以,我们此刻就知道了
- 认证是去证明你的身份,授权是判断你可以访问哪一些资源
- 认证发生在授权之前,授权发生在认证之后
✔JWT 是什么?
JWT , Json web token 是基于 Token 的认证授权机制
见名知意,jwt 也是一种 token ,只不过这种 token 有自己的一些约束和规定
一个 JWT 由 头(header),载荷(payload),签名(signature) 组成,具体细节可以查看这篇文章内容:JWT身份认证(附带源码讲解)
此处聊一下关于使用 JWT 的方式来实现单点登录,
简单流程如下
对于此处,我们一般会去使用 IDaaS (作为认证中心) 来进行认证,在 IDaaS 中,是可以创建应用的,此处的应用即是我们的关联系统
IDaaS 认证完毕后会将用户信息,具体的签名算法,生成一个 JWT ,给到具体的应用(关联系统) ,关联系统用秘钥解析 JWT 并拿到具体的用户信息之后,再去完成自己平台内部的各种校验,进而让该用户完成认证和授权
可以查看到,更多的是需要处理 JWT 产生和解析的一个过程,约定好协议字段就可以了,这种方式最简单
✔OAUTH2.0 是什么?
OAuth2.0 (Open Authorization 2.0) 开放授权协议
见名知意,他是一个授权协议,而不是一个认证协议
此处的 2.0 协议是不兼容之前的 1.0 协议的,此处需要注意,具体更加细节的内容可以查阅:RFC 6749
👀先举一个例子说明为什么要用 OAuth
咱们登录掘金的时候,我们不想在掘金上注册账号密码,而且我们还想直接通过登录微信,来达到登录掘金的目的
那么掘金就不得不和微信有交互,就需要获取到微信的授权
用过这种方式登录的人就知道这种场景,在掘金页面选择微信登录的时候,会弹出掘金正在申请微信授权用户的昵称和头像,需要我们同意
我们同意之后,掘金获取到微信授权,拿到昵称和头像,我们就可以顺利的使用微信账号登录到掘金平台上了
此刻是否会有同学问,直接让微信告诉掘金账号密码不就可以了吗?这样岂不是更方便?
方便是方便了,但是这会埋下巨大的安全问题:
- 对于各大平台来说,密码是隐私,怎么可以给多第三方平台呢
- 如果微信将账号密码给了掘金,那么掘金就可以随时随地的登录我们用户的账号,这是不安全的,而且也是没有办法设置掘金可以使用账号密码的方式访问微信的资源范围和其有效期的
- 按照这种方式,其他平台也可以这样来通过微信授权的方式来登录其他第三方平台,若密码被泄漏了,那么用户在微信上的数据就全部泄漏了,安全问题很大哟
正是因为这样的方式行不通,有智慧的大佬们便推出了 OAuth 授权协议😁😁
✔OAuth3.0 的基本流程
举个例子:在掘金中使用微信认证的方式来登录掘金,主要看大体的方向和流程
通过上述流程我们可以发现和解释关于OAuth2.0 涉及到的名词
其中,我们可以看到微信在整个过程中所处的角色是:
- 资源服务器
- 授权服务器
登录的这个微信用户,叫做:
- 资源拥有者
掘金向微信请求授权的过程中会带上 Redirect_Uri 和 State
- Redirect_Uri 表示经过微信用户同意之后,页面会被重定向到的地方,并且还会给这个Redirect_Uri 带上用户的登录凭证 code 和 State 原值(用于防篡改)
掘金获取到授权许可之后,通过登录凭证向微信拿到访问令牌 Access Token,
掘金拿着 Access Token 即可访问微信的昵称和头像,这个就属于
- Scope 访问范围,决定掘金可以对用户可以访问哪些资源
总结
至此,相信你应该知道什么是单点登录,什么是 JWT ,什么是 OAuth2.0 协议了吧
单点登录是一种思想
JWT 是一种 Token 的形式
OAuth2.0 协议是一种授权协议
单点登录 可以用OAuth2.0 协议来进行实现,实现 OAuth2.0 协议过程中,使用到的 Token 就可以使用 JWT 的方式来生成 Token
感谢阅读,欢迎交流,点个赞,关注一波 再走吧
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
文中提到的技术点,感兴趣的可以查看这些文章:
- OAUTH之钉钉第三方授权
- JWT身份认证(附带源码讲解)
- go-zero jwt 鉴权快速实战
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI