写点什么

OAuth2 的定义和运行流程

作者:阿提说说
  • 2022 年 8 月 07 日
  • 本文字数:1695 字

    阅读完需:约 6 分钟

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。




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

OAuth 的运行流程

OAuth 的 4 个重要角色:


  1. Resource Owner: 资源所有者,通常指用户

  2. Resource Server: 资源服务器,指存放用户受保护资源的服务器,通常需要通过 Acess Token 才能进行访问

  3. Client:客户端,指需要获取用户资源的第三方应用

  4. Authorization Server:授权服务器,用于验证资源所有者,并在验证成果之后向客户端发放相关令牌


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



  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 指授权类型,必须,固定为 codeclient_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

发布于: 刚刚阅读数: 4
用户头像

阿提说说

关注

一年太久,只争朝夕 2017.10.19 加入

还未添加个人简介

评论

发布
暂无评论
OAuth2的定义和运行流程_spring security_阿提说说_InfoQ写作社区