疾风步行者

V1

2022/08/07阅读:24主题:自定义主题1

OAuth2的定义和运行流程

OAuth2 定义

开放授权(Open Authorization OAuth) 是一种资源提供商用于授权第三方应用代表资源所有者获取有限访问权限的授权机制。由于在整个授权过程中,第三方应用都无法触及用户的密码就可以获取部分资源的使用权限,所以OAuth是开放安全的。

OAuth第一个版本诞生于2007年12月,由于OAuth1.0复杂的签名逻辑以及单一的授权流程存在较大缺陷,随后推出了OAuth2.0,OAuth2.0放弃了OAuth1.0中让开发者感到痛苦的数字签名和加密方案,后面我们要讲的都是指OAuth2.0。

对于OAuth,其实大家并不陌生,比如登录百度账户的时候,下面会提供QQ、新浪微博、微信的登录,如图1。当使用QQ登录的时候,会跳转到一个QQ OAuth2.0的登录窗口,登录QQ后再跳转回百度,并登录百度,从而避免在第三方网站提交QQ密码,在QQ登录窗口,右侧显示了第三方网站能够获取的权限资源,只能获取昵称、头像、性别,如图2。 图1

图2
图2

从QQ授权登录机制中,我们基本可以看到OAuth认证的流程和形式。

OAuth 的运行流程

OAuth的4个重要角色:

  1. Resource Owner: 资源所有者,通常指用户
  2. Resource Server: 资源服务器,指存放用户受保护资源的服务器,通常需要通过Acess Token才能进行访问
  3. Client:客户端,指需要获取用户资源的第三方应用
  4. Authorization Server:授权服务器,用于验证资源所有者,并在验证成果之后向客户端发放相关令牌

如图3描述了4种角色的交互流程

图3
图3
  1. Client 客户端要求资源所有者(用户)提供授权许可
  2. 资源所有者(用户)同意向客户端提供授权许可
  3. 客户端携带用户提供的授权许可向授权服务器申请资源服务器的访问令牌
  4. 授权服务器验证客户端及其携带的授权许可,确认有效后发放访问令牌
  5. 客户端使用访问令牌向资源服务器申请资源
  6. 资源服务器验证访问令牌,确认无误后向客户端提供资源

在这个流程中,第二步OAuth定义了4种授权模式,用于将用户的授权许可提供给客户端。

授权码模式(Authorization Code)

授权码模式是功能最完整、流程最严密的授权模式,它将用户引导到授权服务器进行身份验证,授权服务器将发放的访问令牌传递给客户端。百度使用QQ账户登录就是使用的该模式,如下。

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100312028&response_type=code&redirect_uri=https%3A%2F%2Fpassport.baidu.com%2Fphoenix%2Faccount%2Fafterauth%3Fmkey%3D7a58056f35517b863aca5dd7add6a179c927361ed5803d1ff8%26tpl%3Dmn&state=1659803324&display=page&scope=get_user_info%2Cadd_share%2Cget_other_info%2Cget_fanslist%2Cget_idollist%2Cadd_idol%2Cget_simple_userinfo&traceid=

其中,response_type指授权类型,必须,固定为code client_id指客户端id,必须 state指客户端的状态,通常在授权服务器重定向时原样返回 scope为申请的权限范围,如获取用户信息、获取用户相册等,由授权服务器抽象为具体的条目 redirect_uri为授权通过后的重定向URL,授权服务器将在用户登录完成之后重定向到该地址。

隐式授权模式(Implicit)

隐式授权模式的客户端一般指用户浏览器。访问令牌通过重定向的方式传递到用户浏览器中,再通过浏览器的JavaScript代码来获取访问令牌。由于访问令牌直接暴露在浏览器端,所以隐式授权模式可能会导致范围令牌被泄露,仅适用于需要临时访问的场景与授权码模式相比,用户的登录环节是一样的,只是在授权成功之后的重定向,授权码模式是携带一个认证码,由客户端通过认证码申请访问令牌,而隐式授权模式则直接将访问令牌作为URL参数传递给浏览器。 隐式授权模式在重定向时携带的参数有: access_token:访问令牌 expire_in:访问令牌多少秒后过期 state:客户端的状态参数

密码授权模式(Password Credentials)

客户端携带用户的密码向授权服务器申请令牌,这种操作不再像前两种一样跳转到授权服务器进行,而是由客户端提供专用页面。

客户端授权模式(Client Credentials)

客户端授权模式通常由客户端提前向授权服务器申请公钥、秘钥,并通过这些关键信息向授权服务器申请访问令牌,从而得到资源服务器提供的资源。

关于OAuth2的定义和运行流程先讲到这里,下篇将在Spring Security中使用OAuth2。

参考资料:
RFC6749:https://www.rfc-editor.org/rfc/rfc6749.html


关注我,给你看更多精彩文章。

分类:

后端

标签:

后端

作者介绍

疾风步行者
V1

还在奔跑的老程序员