OAuth2 介绍
OAuth 简介
OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源 (如头像、照片、视频等),并且在这个过程中无须将用户名和密码提供给第三方应用。通过令牌 (token) 可以实现这一功能。
每一个令牌授权一个特定的网站在特定的时间段内允许可访问特定的资源。OAuth 让用户可以授权第三方网站灵活访问它们存储在另外一些资源服务器上的特定信息,而非所有的内容。对于用户而言,我们在互联网应用中最常见的 OAuth 应用就是各种第三方登录,例如 QQ授权登录、微信授权登录、微博授权登录、GitHub 授权登录等。
例如用户想登录 Ruby China ,传统方式是使用用户名和密码但是这样并不安全,因为网站会存储你的用户名密码,这样可能会导致密码泄露。这种授权方式安全隐患很大如果使用 OAuth 协议就能很好地解决这一问题。
oAuth2协议解决了多个网站登录问题,账号密码不安全的问题,比如一些小众的网站就可以不用注册登录,使用 oAuth2,也就是通过第三方向要访问的网站发送请求获取Token,第三方网站每次请求写到Token就可以访问到内容。
注意:OAuth2 是 OAuth 协议的下一个版本,但不兼容 OAth 1.0 ,OAth2 关注客户端开发者的简易性,同时为 Web 应用、桌面应用、移动设备、 IOT 设备提供专门的认证流程
oAuth2 就是对用户的信息进步的保护,如很多喜欢将所有密码设置为同样的,就可能会泄露,但是通过已经注册过的网站用户信息,来进行授权给第三方网站信息进行登录则免去了注册,oAuth主要做的就是认证保护用户隐私安全
OAuth2 授权总体流程
- (A) 用户打开客户端以后,客户端要求用户给予授权
- (B) 用户同意给予客户端授权
- (C) 客户端使用上一步获得的授权,向认证服务器申请令牌
- (D) 认证服务器对用户端进行认证以后,确认无误,同意发放令牌
- (E) 客户端使用令牌,向资源服务器申请资源
- (F) 资源服务器确认令牌无误,同意向客户端开放资源
从上图中我们可以看出六个步骤之中,B是关键,即用户怎么才能给于客户端授权。同时会发现 OAuth2 中包含四种不同角色:
- Client :第三方应用。
- Resource Owner:资源所有者
- Authorizetion Server :授权服务器
- Resource Server :资源服务器
注意:授权服务器和资源服务器可以放一起,但是在如今的互联网和分布的推动下,都是分别存储
OAuth2 四种授权模式
OAuth2 协议一种支持四种不同的授权模式:
授权码模式
授权码模式(Authorization Code ) 是功能最完整,流程最严密、最全并且使用最广泛的一种 OAuth2 授权模式。同时也是最复杂的一种授权模式,它的特点就是通过客户端的后台服务器,与服务器提供商的认证服务器进行交互。
常见的第三方平台登录功能基本都是使用这种模式。(安全性高)
其具体授权流程如下:
简化模式
简化模式是不需要第三方服务端(客户端)参与,直接在浏览器中向授权服务器申请令牌(token),如果网站是纯静态页面,则可以采用这种方式。
密码模式
密码模式是用户把用户名/密码直接告诉客户端,客户端使用在这些信息项授权服务器申请令牌(token)。这需要用户对客户端高度信任,例如客户端应用和服务器提供商就是同一家公司。
客户端模式
客户端模式是指客户端使用自己的名义而不是用户的名义向授权服务器提供申请授权。严格来说,客户端模式并不能算作 OAuth 协议解决问题的一种解决方案,但是对于开发者而言,在一些为移动端提供的授权服务器上使用这种模式还是非常方便的。
OAuth2 标准接口
/oauth/authorize:授权端点 ,固定授权入口路径 ,也是授权服务器的用户允许授权的页面
/oauth/token :获取令牌端点
/oauth/confirm_access:用户确认授权提交端点
/oauth/error:授权服务错误信息端点
/oauth/check_token:用于资源服务访问的令牌解析端点
/oauth/token_key:提供公有密钥的端点,如果使用 JWT 令牌的话
以上是规范化固定接口 ,端口就是路径
OAuth2 整合微服务架构
- 网关微服务:作为资源服务器
- 授权认证微服务:作为认证服务器
用户不能直接去访问资源服务器(网关),必须先到认证服务器认证,通过后颁发一个token令牌给你,你只有拿着token访问资源服务器才能通过,令牌token是有时间限制的,到时间了就无效。
其中网关为什么能作为“资源服务器”呢? 网关是作为各个微服务(会员服务、商品服务、订单服务等)统一入口,也就是这些资源服务的统一门面,在这里可以对JWT验签、JWT有效期判断、JWT携带角色权限判断。
OAuth2 和 JWT关系
- OAuth2 是一种认证授权的协议规范
- JWT 是基于 token 的安全认证协议的实现
OAuth2 的认证服务器签发的 token 可以使用 JWT 实现,JWT轻量且安全。