登录流程
GitHub设置
填写应用信息
1.首先登录你的GitHub,然后点击进入Settings;
2.选择OAuth Apps
3.注册应用信息
4.填写应用信息
这里主要是Authorization callback URL的填写;
这个应用回调地址就是上面登录流程授权之后返回的redirect_uri。
获取Client_id和Client_secret
上面的1 users
说明目前有1个GitHub账号登录应用。
上面的GitHub设置的官方文档-Registering OAuth Apps
看文档
在代码实现之前还是先看看文档。
About authorization options for OAuth Apps。
其实文档里面已经清晰的说明了授权登录的主要3个步骤:
1.web端重定向http://github.com/login/oauth/authorize;
2.根据code获取access_token;
3.根据access_token获取用户信息;
这里的第2步和第3步,建议在后端实现,为什么在后端实现了,因为第2不接口里面需要Client_secret
这个参数。
代码实现
效果见本站
// +---------------------------------------------------------------------- // | Copyright (c) 2017. // +---------------------------------------------------------------------- // | Author: 祭夜 <me@jysafe.cn> // +---------------------------------------------------------------------- /** * Github第三方登录认证 */ class Ghconnect { private static $data; //APP ID private $app_id=""; //APP KEY private $app_key=""; //回调地址 private $callBackUrl=""; //Authorization Code private $code=""; //access Token private $accessToken=""; //role private $role=""; public function __construct(){ $this->app_id = '***********';//Client ID $this->app_key = '************';//Client Secret $this->callBackUrl = '************'; $this->code=$_GET['code']; //检查用户数据 if(empty($_SESSION['QC_userData'])){ self::$data = array(); }else{ self::$data = $_SESSION['QC_userData']; } } //获取Code public function getAuthCode(){ $url="https://github.com/login/oauth/authorize"; //$param['response_type']="code"; $param['client_id']=$this->app_id; $param['redirect_uri']=$this->callBackUrl; //-------生成唯一随机串防CSRF攻击 $state = md5(uniqid(rand(), TRUE)); $_SESSION['state']=$state; $param['state']=$state; //$param['scope']="get_user_info"; $param =http_build_query($param,'','&'); $url=$url."?".$param; header("Location:".$url); } //通过Code获取Access Token public function getAccessToken(){ $url="https://github.com/login/oauth/access_token"; $param['client_id']=$this->app_id; $param['client_secret']=$this->app_key; $param['code']=$this->code;//$_GET['code']; $param['redirect_uri']=$this->callBackUrl;//'https://www.jysafe.cn/wp-content/plugins/QQoQ/ghcallback.php'; $param =http_build_query($param,'','&'); $data = $this->postURL($url,$param); $data = json_decode($data); $_SESSION['access_tokengh'] = $data->access_token; //echo $data->access_token; //echo 'token'.$data->access_token; return $data; } //获取信息 public function getUsrInfo(){ $access_token = $_SESSION['access_tokengh']; if(!$access_token){ $rdata = $this->getAccessToken(); $access_token = $rdata->access_token; } if(empty($access_token)){ return false; } $url="https://api.github.com/user"; $param['access_token'] = $access_token; $param =http_build_query($param,'','&'); $url=$url."?".$param; $rzt=json_decode($this->getUrl($url)); //echo '获取Github用户的个人公开信息链接:'.$url; //echo var_dump($rzt); return $rzt; } //CURL GET private function getUrl($url){ $ch = curl_init($url); $headers[] = 'User-Agent: jiyeme'; curl_setopt($ch, CURLOPT_HTTPHEADER,$headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5); if (!empty($options)){ curl_setopt_array($ch, $options); } $data = curl_exec($ch); curl_close($ch); return $data; } //CURL POST function postUrl($url,$data){ $ch = curl_init (); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt ( $ch, CURLOPT_POST, TRUE ); $headers[] = 'Accept: application/json'; curl_setopt($ch, CURLOPT_HTTPHEADER,$headers); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, TRUE); $ret = curl_exec ( $ch ); curl_close ( $ch ); return $ret; } }
在第2个Get请求的时候我设置了一个:
$headers[] = 'User-Agent: jiyeme'; curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
为什么呢?其实也是踩坑过来了。如果不设置会报错导致请求不成功,报错信息:
Request forbidden by administrative rules. Please make sure your request has a User-Agent header (http://developer.github.com/v3/#user-agent-required). Check https://developer.github.com for other possible causes.\n'
其实也就是HTTP请求的403错误,但是这个请求在浏览器端是没有任何问题了。为什么呢?
这里还是看官方的说明:User Agent Required。
这里其实告诉了我们解决办法,就是把User-Agent
设置成你的GitHub的用户名或者应用名,这里我设置的是GitHub的用户名。
最后
最后我们发现第三方登录的流程其实都差不多,差别就是不同的平台,和自己应用的业务会有点不一样。所以呢,在做之前先要理清思路,仔细看文档。