OAuth2入门与客户端授权码模式详解
一、什么是OAuth协议
OAuth协议为用户资源的授权提供了一个安全又简易的标准。与以往的授权方式不同之处是 OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth是安全的。OAuth 是 Open Authorization 的简写
OAuth本身不存在一个标准的实现,后端开发者自己根据实际的需求和标准的规定实现。其步骤一般如下:
- 第三方要求用户给予授权
- 用户同意授权
- 根据上一步获得的授权,第三方向认证服务器请求令牌(token)
- 认证服务器对授权进行认证,确认无误后发放令牌
- 第三方使用令牌向资源服务器请求资源
- 资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源
二、OAuth2是为了解决什么问题?
任何身份认证,本质上都是基于对请求方的不信任所产生的。同时,请求方是信任被请求方的,例如用户请求服务时,会信任服务方。所以,身份认证就是为了解决身份的可信任问题。
在OAuth2.0中,简单来说有三方:用户(这里是指属于服务方的用户)、服务方(如微信、微博等)、第三方应用
- 服务方不信任用户,所以需要用户提供密码或其他可信凭据
- 服务方不信任第三方应用,所以需要第三方提供自已交给它的凭据(如微信授权的code,AppID等)
- 用户部分信任第三方应用,所以用户愿意把自已在服务方里的某些服务交给第三方使用,但不愿意把自已在服务方的密码等交给第三方应用
三、OAuth2成员和授权基本流程
OAuth2成员
- Resource Owner(资源拥有者:用户)
- Client (第三方接入平台:请求者)
- Resource Server (服务器资源:数据中心)
- Authorization Server (认证服务器)
OAuth2基本流程
步骤详解:
- 第三方请求用户授权
- 用户同意授权后,会从服务方获取一次性用户授权凭据(如code码)给第三方
- 第三方会把授权凭据以及服务方给它的的身份凭据(如AppId)一起交给服务方的向认证服务器申请访问令牌
- 认证服务器核对授权凭据等信息,确认无误后,向第三方发送访问令牌Access Token等信息
- 通过这个Access Token向Resource Server索要数据
- 资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源
这样服务方,一可以确定第三方得到了用户对此次服务的授权(根据用户授权凭据),二可以确定第三方的身份是可以信任的(根据身份凭据),所以,最终的结果就是,第三方顺利地从服务方获取到了此次所请求的服务
从上面的流程中可以看出,OAuth2.0完整地解决了用户、服务方、第三方 在某次服务时这三者之间的信任问题
四、第三方客户端授权码模式详解
授权模式
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式:
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器与”服务提供商”的认证服务器进行互动。
授权码流程
- 用户访问客户端应用,客户端应用将其导向认证服务
- 认证服务器弹出授权界面
- 用户选择是否授权给客户端应用
- 若用户给予授权,认证服务将用户导向至事先客户端先指定的重定向URL,同时附上授权码
- 客户端应用收到授权码,向认证服务器申请令牌,这步操作在客户端后台的服务器上完成的,对用户不可见
- 认证服务器核对授权码,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)