OAuth(Open Authorization,即开放授权)是一个无需告知第三方用户的账号以及密码的情况下,授权用户信息给第三方的一个安全,开放的标准协议。更多关于协议的介绍,读者可以参考RFC 6749。
下面开始简单的说明下该协议下最为经典的Authorization Code模式,介绍如下图:
我们说明下,上方流程中一共有四个角色。
ResourceOwner为资源所有者,就是我们的用户自己
User-Agent就是我们访问应用的浏览器
Client为第三方服务
AuthorizationServer为认证服务器,可以理解为用户资源的提供方。
那么调用的流程则为:
用户本人通过浏览器访问Client第三方的服务,Client通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
此时用户在浏览器上选择是否同意授权
若用户同意授权,则认证服务器将用户重定向到第一步指定的重定向URI,同时附上一个授权码Code
第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)
d和e都是在服务端执行的,不需要通过浏览器
一、授权登录链接的构造
首先在用户访问一个应用时,前端调用服务端的接口,服务端检测到用户未登录,此时构造一个授权链接。
$redirect_uri = 'https://test.xx.ccom/index'; $this->goUrl('https://auth.xx.com/connect/oauth2/authorize?appid=xxx&redirect_uri='.$redirect_uri);
将该链接返回给到前端,前端直接跳转到该链接。然后https://auth.xx.com/connect/oauth2/authorize
对展示一个是否同意授权的页面,用户通过点击授权,此时认证服务器将直接重定向到redirect_uri并且携带一个Code参数。服务端再接收到这个code参数时,通过该参数前往认证服务器获取access_token。
$code = $_GET['code']; $res = file_get_contents('.$code ); $access_token = $res['access_token'];
然后服务端再通过这个access_token到认证服务器换取用户信息。
$res = file_get_contents('https://auth.xx.com/user_info?token='.$access_token ); $uid = $res['uid']; $name = $res['name'];
通过该协议获取到了用户可以做一定的缓存,避免认证服务器压力过大。
第三方可以设计一定的cookie原则,用来存储用户信息避免一直请求认证服务器。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!