OAuth2
OAuth2基础
-
OAuth2是什么
-
OAuth
OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。
-
OAuth协议
OAuth协议,是一种授权协议,不涉及具体的代码,只是表示一种约定的流程和规范。OAuth协议一般用于用户决定是否把自己在某个服务商上面的资源(比如:用户基本资料、照片、视频等)授权给第三方应用访问。
-
-
OAuth2
OAuth 2.0授权框架支持第三方支持访问有限的HTTP服务,通过在资源所有者和HTTP服务之间进行一个批准交互来代表资源者去访问这些资源,或者通过允许第三方应用程序以自己的名义获取访问权限。
为了方便理解,可以想象OAuth2.0就是在用户资源和第三方应用之间的一个中间层,它把资源和第三方应用隔开,使得第三方应用无法直接访问资源,从而起到保护资源的作用。
为了访问这种受保护的资源,第三方应用(客户端)在访问的时候需要提供凭证。即,需要告诉OAuth2.0你是谁你要做什么。
你可以将用户名和密码告诉第三方应用,让第三方应用直接以你的名义去访问,也可以授权第三方应用去访问。
可以联想一下微信公众平台开发,在微信公众平台开发过程中当我们访问某个页面,页面可能弹出一个提示框应用需要获取我们的个人信息问是否允许,点确认其实就是授权第三方应用获取我们在微信公众平台的个人信息。这里微信网页授权就是使用的OAuth2.0。
- OAuth主要有OAuth 1.0a和OAuth 2.0两个版本,1.0a版本过于复杂,2.0版本已得到广泛应用,故二者完全不同,且不兼容。OAuth2.0 是目前广泛使用的版本,我们多数谈论OAuth时,为OAuth2.0。
-
-
OAuth2实现的基本逻辑和功能
https://www.cnblogs.com/meibaorui/p/9182660.html
-
典型过程案例
黑马程序员网站使用微信认证的过程
-
过程的简要描述
用户借助微信认证登录黑马程序员网站,用户就不用单独在黑马程序员注册用户,怎么样算认证成功吗?黑马程序员网站需要成功从微信获取用户的身份信息则认为用户认证成功,那如何从微信获取用户的身份信息?用户信息的拥有者是用户本人,微信需要经过用户的同意方可为黑马程序员网站生成令牌,黑马程序员网站拿此令牌方可从微信获取用户的信息。
-
实现过程
1、客户端请求第三方授权
用户进入黑马程序的登录页面,点击微信的图标以微信账号登录系统,用户是自己在微信里信息的资源拥有者。点击“微信”出现一个二维码,此时用户扫描二维码,开始给黑马程序员授权。
2、资源拥有者同意给客户端授权
资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证, 验证通过后,微信会询问用户是否给授权黑马程序员访问自己的微信数据,用户点击“确认登录”表示同意授权,微信认证服务器会颁发一个授权码,并重定向到黑马程序员的网站。3、客户端获取到授权码,请求认证服务器申请令牌
此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。
4、认证服务器向客户端响应令牌
微信认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。
此交互过程用户看不到,当客户端拿到令牌后,用户在黑马程序员看到已经登录成功。
5、客户端请求资源服务器的资源
客户端携带令牌访问资源服务器的资源。
黑马程序员网站携带令牌请求访问微信服务器获取用户的基本信息。
6、资源服务器返回受保护资源
资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。 -
以上认证授权详细的执行流程如下:
-
官方文档认证流程图
-
-
另一个例子说明OAuth2运行流程
https://www.cnblogs.com/meibaorui/p/10981988.html
-
注意文末提及的OAuth2新增的Refresh_Token机制
-
OAuth 中心组件
https://zhuanlan.zhihu.com/p/89020647
- Scopes and Consent
- Actors
- Clients
- Tokens
- Authorization Server
- Flows
特别注意Tokens中两个流程,是OAuth实现的两个重点
这里的两个流程对应下面重要文档4.1的4个小点
OAuth Actors
-
客户端Third-party Application:
本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Android客户端、Web客户端(浏览器端)、微信客户端等。 -
资源拥有者Resource Owner:
通常为用户(User),也可以是应用程序,即该资源的拥有者。例如:我是一名Facebook的用户,我拥有我的Facebook 个人简介的信息。 -
授权服务器(也称认证服务器)Authorization Server:
OAuth的主要引擎,授权服务器,获取token。它用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌(access_token),作为客户端访问资源服务器的凭据。本例为微信的认证服务器。 -
资源服务器Resource Server:
存储用户信息的API Service,即存储资源的服务器,本例子为微信存储的用户信息。一般用于接口的形式返回第三方应用请求的资源。它可以与授权服务端属于同一个应用,也可以分别属于不同的应用。- 现在还有一个问题,服务提供商能允许随便一个客户端就接入到它的授权服务器吗?
- 答案是否定的,服务提供商会给准入的接入方一个身份,用于接入时的凭据:
client_id:客户端标识 client_secret:客户端秘钥
因此,准确来说,授权服务器对两种OAuth2.0中的两个角色进行认证授权,分别是资源拥有者、客户端。
- 答案是否定的,服务提供商会给准入的接入方一个身份,用于接入时的凭据:
- 现在还有一个问题,服务提供商能允许随便一个客户端就接入到它的授权服务器吗?
OAuth Flow
也叫授权模式
- 授权码模式(authorization code):这是功能最完整,流程最严密的模式。现在主流的使用OAuth2.0协议授权的服务提供商都采用了这种模式,我在下面举例也将采取这种模式。
- 简化模式(implicit):跳过了请求授权码(Authorization Code)的步骤,直接通过浏览器向授权服务端请求令牌(Access Token)。这种模式的特点是所有步骤都在浏览器中完成,Token对用户可见,且请求令牌的时候不需要传递client_secret进行客户端认证。
- 密码模式(resource owner password credentials):用户向第三方客户端提供自己在授权服务端的用户名和密码,客户端通过用户提供的用户名和密码向授权服务端请求令牌(Access Token)。
OAuth2拓展知识点
OpenID Connect
https://zhuanlan.zhihu.com/p/89020647 中的OpenID Connect
重要文档
https://www.cnblogs.com/cjsblog/p/9174797.html?wework_cfm_code=MtW5u0qrFy0F7Q6pwCwml7reQxAZOu%2FwqLnmx05V2p3kzdRV9HhiNanOdp6JFQMQOPRsnyxvv82f4R3HqnoyMFGujJtPxz%2B%2BJXCd6u20MpB0
上述文档有一处错误
4.1.3. Access Token Request
- redirect_uri:如果在授权请求的时候包含"redirect_uri"参数,那么这里也需要包含"redirect_uri"参数。而且,这两处的"redirect_uri"必须完全相同。
此处的uri是可以不同的,前面半句话是正确的
- 着重注意
2. Client Registration
6. Refreshing an Access Token
4.1. Authorization Code Grant
- 其他补充
- 其他全文
OAuth2实现案例
使用授权码模式(authorization code)实现百度账号登录:https://www.zifangsky.cn/1309.html
-
授权码模式(authorization code)授权的流程
采用Authorization Code获取Access Token的授权验证流程又被称为Web Server Flow,适用于所有有Server端的应用,如Web/Wap站点、有Server端的手机/桌面客户端应用等。一般来说总体流程包含以下几个步骤:
- 通过client_id请求授权服务端,获取Authorization Code。
- 通过Authorization Code、client_id、client_secret请求授权服务端,在验证完Authorization Code是否失效以及接入的客户端信息是否有效(通过传递的client_id和client_secret信息和服务端已经保存的客户端信息进行匹配)之后,授权服务端生成Access Token和Refresh Token并返回给客户端。
- 客户端通过得到的Access Token请求资源服务应用,获取需要的且在申请的Access Token权限范围内的资源信息。
-
实现流程和代码
OAuth2进阶
OAuth2实现SSO单点登录
https://blog.51cto.com/u_15023237/2647396
https://www.cnblogs.com/cjsblog/p/10548022.html?wework_cfm_code=M8t00ZCzRYen9lXLJBmwSW0YtwL2W%2ByaLzWj3PklNl8d2C%2BIWMBrLE78mYccLEs2sq4GUbq8ztvBDI4TNHEZQ4C3fwg7Ocs0HTInQi1QjutC