OAuth 2.0——授权服务开发笔记(一)

一、概念

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。因为1.0版设计的很繁琐,所以被抛弃了。

 OAuth 协议为用户资源的授权提供了一个安全又简易的标准。与以往的授权方式不同之处是 OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth是安全的。OAuth 是 Open Authorization 的简写

OAuth 本身不存在一个标准的实现,后端开发者自己根据实际的需求和标准的规定实现。其步骤一般如下:

1.第三方要求用户给予授权
2.用户同意授权
3.根据上一步获得的授权,第三方向认证服务器请求令牌(token)
4.认证服务器对授权进行认证,确认无误后发放令牌
5.第三方使用令牌向资源服务器请求资源
6.资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源

二、OAuth成员:

1.Resource Owner(资源拥有者:用户)
2.Client (第三方接入平台:请求者)
3.Resource Server (服务器资源:数据中心)
4.Authorization Server (认证服务器)

三、思路流程

OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。
"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。

授权步骤:

①Authorization Request, 第三方请求用户授权
②Authorization Grant,用户同意授权后,会从服务方获取一次性用户授权凭据(如code码)给第三方
③Authorization Grant,第三方会把授权凭据以及服务方给它的的身份凭据(如AppId)一起交给服务方的向认证服务器申请访问令牌
④Access Token,认证服务器核对授权凭据等信息,确认无误后,向第三方发送访问令牌Access Token等信息
⑤Access Token,通过这个Access Token向Resource Server索要数据
⑥Protected Resource,资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源
    这样服务方,一可以确定第三方得到了用户对此次服务的授权(根据用户授权凭据),二可以确定第三方的身份是可以信任的(根据身份凭据),所以,最终的结果就是,第三方顺利地从服务方获取到了此次所请求的服务
    从上面的流程中可以看出,OAuth2.0完整地解决了用户、服务方、第三方 在某次服务时这三者之间的信任问题

四、授权类型:

在开放授权中,第三方应用(Client)可能是一个Web站点,也可能是在浏览器中运行的一段JavaScript代码,还可能是安装在本地的一个应用程序。这些第三方应用都有各自的安全特性。对于Web站点来说,它与RO浏览器是分离的,它可以自己保存协议中的敏感数据,这些密钥可以不暴露给RO;对于JavaScript代码和本地安全的应用程序来说,它本来就运行在RO的浏览器中,RO是可以访问到Client在协议中的敏感数据。

OAuth有多种授权类型,如授权码 (Authorization Code Grant)、隐式授权 (Implicit Grant)、RO凭证授权 (Resource Owner Password Credentials Grant)、Client凭证授权 (Client Credentials Grant)。

五、更新令牌:

如果用户访问的时候,客户端的访问令牌access_token已经过期,则需要使用更新令牌refresh_token申请一个新的访问令牌。客户端发出更新令牌的HTTP请求,包含以下参数:

granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
refresh_token:表示早前收到的更新令牌,必选项。
scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

六、案例参考

facebook的Oauth2.0认证:

第一步:

App向 Oauth Server 请求的URL => https://facebook.com/dialog/oauth?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=REDIRECT_URI&scope=email

里面带着该app的id,key,请求的类型,返回一串的access_token和事件类型code。

第二步:

回调,跳转到权限确认页面等待用户确认授权 => https://facebook.com/dialog/oauth?response_type=code&client_id=28653682475872&redirect_uri=example.com&scope=email

该页面通过redirect_uri,回调到指定的callback页面。

第三步:

利用返回的access_token,将app的id和key以及code代码发包到:POST https://graph.facebook.com/oauth/access_token

这一步是为了获取token。

第四步:

Oauth Server返回token,这个时候,就可以通过token获取用户授权的资源了。

参考文档:

https://segmentfault.com/a/1190000000758580

https://segmentfault.com/a/1190000010540911

猜你喜欢

转载自blog.csdn.net/sm9sun/article/details/88309114
今日推荐