1、Auth2.0 协议简介
2、OAuth 2.0的授权认证流程
OAuth 2.0 的核心概念
认证思路与流程
3、OAuth2.0 的四种模式
授权码模式(authorization code)
隐式授权模式(Implicit Grant)
资源所有者密码凭证模式(Resource Owner Password Credentials Grant)
客户端凭证模式(Client Credentials Grant)
4、相关文章
Auth2.0 协议简介
关于应用系统用户身份管理需求,包括身份认证、权限授权、单点登录、联合身份认证等业务场景,业界有一堆的标准和规范,比如单点登录的CAS、Kerberos,第三方身份认证OpenID,第三方用户授权OAuth,联合身份认证和授权数据标准SAML等。每种技术有各自的应用场景,也存在交叉场景,想要把他们搞清楚,需要了解各种技术的工作原理和应用场景。今天就从其中一个技术开始,对OAuth2.0用户授权框架做一个简单介绍,想对框架全面了解的可以参考框架的标准RFC6749。Oauth使用场景:
- 第三方登录(确定登录的身份等信息)
- API鉴权(确定请求方是否被许可)
在OAuth之前,HTTP Basic Authentication, 即用户输入用户名&密码的形式进行验证, 这种形式是不安全的。OAuth的出现就是为了解决访问资源的安全性以及灵活性。举一个通俗的例子,用户把照片、视频、联系人数据存储在内容托管云服务R(Resource)中的Picture、Video、Contact三个模块中;用户使用在线照片打印服务P(Printer),用户需要让P服务读取R服务中的照片进行打印,但不想让P服务读取R服务中的其他数据。传统方式下,用户只能向P服务提供R服务的用户名密码,P服务通过用户名密码登录R服务,读取照片,并且不能限制P服务读取的范围。使用OAuth框架,通过以下授权流程,在不暴露用户密码的情况下,向P服务授予有限的操作S服务的权限,整体流程如下:
- 用户登录P服务,点击获取R服务权限的链接。
- 浏览器跳转到R服务,用户登录R服务后,跳出向P服务授予权限的界面。
- 用户选择授予Picture模块、只读、有效期1小时三个权限的授权选项,并提交。
- 页面跳转回P服务,并携带R服务生产的授权码(Picture模块只读权限)。
- P服务获得授权码,通过授权码(附加clint_id和client_secret)向R服务发起读取Picture模块请求。
- R服务验证用户信息和授权码后,向P服务提供Picture的读取权限。
OAuth发展至今,共有三个版本,分别为:初始化版本OAuth1.0;漏洞修复版本OAuth 1.0a;不向后兼容的OAuth2.0版本。2.0版本主要是修复了前面版本的安全漏洞,对授权的流程进行了优化,提供了更丰富的使用场景,由于优化精简了授权的步骤,所以不能向后兼容。
OAuth 2.0的授权认证流程
OAuth 2.0 的核心概念
根据RFC描述,OAuth 2.0定义了4种服务角色,分别描述如下:
-
资源所有者 Resource Owner,能够授予对受保护资源的访问权限的实体,当资源所有者是人员时,资源所有者就是最终用户。
-
资源服务器 Resource Server,托管受保护资源的服务器,能够使用访问令牌(Access Token)接受和响应受保护的资源请求。
-
客户端 Client,代表资源所有者,经其授权后向受保护资源发起请求的应用程序。
-
授权服务器 Authorization Server,授权服务器对资源所有者进行认证并获取授权后,向客户端颁发访问令牌(Access Token)
在认证和授权的过程中涉及的一些概念:
访问令牌(access token)
访问令牌是在用户授权许可下,授权服务器下发给客户端的一个授权凭证,该令牌所要表达的意思是“用户授予该APP在多少时间范围内允许访问哪些与自己相关的服务”,所以访问令牌主要在 时间范围 和 权限范围 两个维度进行控制,此外访问令牌对于客户端来说是非透明的,外在表现就是一个字符串,客户端无法知晓字符串背后所隐藏的用户信息,因此不用担心用户的登录凭证会因此而泄露。
刷新令牌(refresh token)
刷新令牌的作用在于更新访问令牌,访问令牌的有效期一般较短,这样可以保证在发生访问令牌泄露时,不至于造成太坏的影响,但是访问令牌有效期设置太短存在的副作用就是用户需要频繁授权,虽然可以通过一定的机制进行静默授权,但是频繁的调用授权接口,之于授权服务器也是一种压力,这种情况下就可以在下发访问令牌的同时下发一个刷新令牌,刷新令牌的有效期明显长于访问令牌,这样在访问令牌失效时,可以利用刷新令牌去授权服务器换取新的访问令牌,不过协议对于刷新令牌没有强制规定,是否需要该令牌是客户端可以自行选择。
回调地址(redirect uri)