- 统一认证与授权——OAuth2.0开放授权平台
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
上面这段话是百度百科上面给的解释,其实Oauth2.0说白了就是一种协议,而按照这种协议的话,我们能实现第三方授权操作;第三方授权其实我们也都用到过,就比如说现在我要去爱奇艺看电视,而有些资源是需要VIP的,那我首先得登录吧,然后登录之后再充个会员就可以看了。那登录的时候你会发现,可以选择微信等账号登录,这其实就是Oauth2.0的应用。
1.1 Oauth2.0中的角色在正式讲解Oauth2.0的实现流程与实战之前,我们先来明确一下这个玩意中的几种角色。网上也有一大堆资料,但是可能很多同学可能分不太清这些角色到底是什么,OK,那我这里给大家做个解释。
还是按照上面那个登录爱奇艺的例子来看,我们要通过微信这种方式去登录爱奇艺,那这个时候实际上就是我们在点击微信登录按钮的时候,首先第三方客户端(也就是爱奇艺)要先重定向请求到微信的某个接口,请求认证,如果通过认证了,微信就会返回一个token给爱奇艺,然后爱奇艺再根据这个token去微信的另一个接口获取我的微信名啊、头像啊等等资源。这就是大体流程,后面会给出具体流程图。接下来我们根据这个流程来分析一下有哪些角色。
- 资源所有者(Resource Owner):就是我,资源只的就是我在微信上面的头像啊,昵称啊等资源。
- 第三方应用:或者称为第三方客户端(Clinet),希望使用资源服务器提供的资源,这里就是爱奇艺,它想要使用我的微信名,微信头像等资源。
- 认证服务器(Authorization Server):专门用于对资源所有者的身份进行认证,对要访问的资源进行授权、产生令牌的服务器。访问资源,需要通过认证服务器由资源所有者授权才可以访问。这里其实就是微信的授权系统。
- 资源服务器(Resource Server):存储用户的资源,验证令牌有效性。这里指的就是微信中保存我微信信息的服务器。
- 服务提供商(Service Provider):认证服务和资源服务归属于一个机构,该机构就是服务提供商。就是腾讯嘛。
OK,明确了角色的概念之后,再来看看这个登录的具体流程。
1.2 Oauth2.0模式OAuth2.0在第三方应用和服务提供商之间,设置一个授权层(authorization layer)。这样做的目的就是因为第三方应用它不能直接登录服务提供商的,就像爱奇艺不能直接登录微信一样,那这个时候如果爱奇艺想要用微信的资源的话,怎么办?就是在他们之间增加一个授权层,让用户给爱奇艺授权,这样,爱奇艺就能使用该用户的某一部分资源了。而Oauth2.0又分为四种授权方式,接下来每种模式都介绍一下。
1.2.1 授权码模式Authorization Code
授权码模式(Authorization Code):功能是最完整的,流程也是最严密的,国内各大服务提供商(微信、微博、淘宝、百度)都是使用此授权模式进行授权。该授权模式可以确定是用户进行授权的,并且令牌是认证服务器发放到第三方应用服务器上,而不是浏览器上。该模式的认证流程如下:
- 用户进入爱奇艺应用,想看特殊电影,那得登录啊。
- 点击微信登录,就会跳转到微信的登录页面,这是爱奇艺重定向到微信的认证服务端
- 返回一个授权页面给用户
- 用户微信扫码或者直接输入账号密码进行授权
- 微信认证服务器产生一个授权码返回给爱奇艺
- 爱奇艺拿到这个授权码然后再发送请求到微信认证服务器请求一个token
- 微信认证服务器认证成功返回给爱奇艺一个token
- 爱奇艺拿着这个token请求微信的资源服务器获取微信名和头像
- 微信资源服务器校验token成功后响应这些信息给爱奇艺
- 爱奇艺登录成功
- 返回特殊电影给用户
简化模式(Implicit):和授权码模式不同的是,令牌发放给浏览器,OAuth2客户端运行在浏览器中。而不是发放该第三方应用的服务器。
1.2.3 密码模式密码模式(resource owner password credentials):将用户和密码传过去,直接获取accesstokne,用户同意授权动作是在第三方应用上完成,而不是在认证服务器。第三方应用申请令牌时,直接带用户名和密码去向认证服务器申请令牌。这种方式认证服务器无法断定用户是否真的授权,用户和密码可能是第三方应用盗取过来的。
流程如下:
- 用户向客户端直接提供认证服务器想要的用户名和密码。
- 客户端将用户名和密码发给认证服务器,向认证服务器请求令牌
- 认证服务器确认后,向客户端提供访问令牌
- 后面的流程跟上面的类似
客户端模式(client credentials):这种模式实际上不是让用户授权去登录微信了,而是让客户端也就是爱奇艺自己去登录微信,拿相应的资源。这种模式使用较少,当一个第三方应用自己本身需要获取资源,而不是获取用户资源时,客户端模式十分有用。
流程如下:
- 客户端向认证服务器进行身份认证,并要求一个访问令牌
- 认证服务器确认后,向客户端提供访问令牌