OAuth是一个关于授权的开放网络标准,主要是用来让用户授权给第三方应用从而或者用户在服务器的一些数据
通俗点讲,用户在A网站有几张图片,但是获取的时候需要进行登录,而用户在B网站的时候也需要获取这几张图片,然而B服务器是没有这些数据的,他需要从A网站中获取用户的数据,这样一来,就需要用户在B网站进行授权,让B网站可以提取用户在A网站的数据,最典型的就是使用微信登录第三方网站,估计这个随处可见
资源拥有者:也就是用户,简单可以理解为微信用户
客户端:就是要获取用户的第三方应用,例如上面的B网站
授权服务器:用来提供接口给B客户端获取资源拥有者的访问权限的
资源服务器:用户存储的资源所在的服务器,通常来说和授权服务器是在一起的
以上为Oauth2协议中的核心角色,接下来还有一些核心参数,如下
client_id: 客户端id,第三方软件需要在A网站进行注册,然后A 网站会返回的一个参数
client_secret: 同上,类似于一种标识这个客户端的密钥
grant_type:授权模式,有4种模式,后面说
access_token : 当A服务器认真后返回给B服务器用来访问具体用户资源的凭证
refresh_token : 当access_token失效时用来刷新获取一个新的access_token
相对来说,操作最复杂,但是也是使用比较多的一种模式,需要分两步进行
1. 获取code授权码,伪链接如下
http:a.com/oauth/authorization?client_id=b&grant_type=code&redirect_uri=b.com/auth
B网站需要引导用户去访问A网站提供的地址,该地址A网站会让用户去登录,用户同意后那么A网站会访问redirect_uri并带上code参数到B网站上面
2. 获取token信息,伪链接如下
http:a.com/oauth/token?client_id=b&client_secret=bsecre&code=CODE
这个是后台请求的,用户是看不到的,访问这个以后如果是正常的话A网站会返回access_token和refresh_token两个token信息
3. 有了access_token之后就可以通过这个请求用户在A网站上的数据了,可以直接带在参数上也可以放在请求里
当网站没有后端程序的时候,就只能使用这种模式进行处理了,这种相对来说就非常简单,但是也不安全,只需要一步就可以处理
1. 直接获取token信息,伪链接如下
http:a.com/oauth/authorization?client_id=b&grant_type=token&redirect_uri=b.com/auth
返回的信息就是access_token,后续的操作就是一样的了
当用户足够信任网站的时候,就可以使用这种模式进行授权,跟简化模式其实差不多
1. 直接获取token信息,伪链接如下
http:a.com/oauth/authorization?&grant_type=password&username=name&password=password&redirect_uri=b.com/auth
返回的信息就是access_token,后续的操作就是一样的了
跟上面两种也差不多,只不过这个权限很大,不需要用户的同意,等于你只要有client_id就可以操作用户的资源了,这种模式一般在内部使用的比较多
1. 直接获取token信息,伪链接如下
http:a.com/oauth/authorization&grant_type=client&client_id=id&client_secret=client_secret&redirect_uri=b.com/auth
返回的信息就是access_token,后续的操作就是一样的了
access_token 的时间总是有效的,如果每次失效就要让用户重新进行授权,对于用户来说体验多少有点不好,所以Oauth2提供了一种刷新token的机制,就是利用上面的refresh_token调用专门的接口获取新的access_token,同时旧的access_token也会被失效
以上是Oauth2的基础概念和几种基本的模式,每个网站的时候可能不太一样,不过总的原则总是需要遵循这一套标准的,具体的实现与业务相关