一、先在github的开放平台申请app的授权,得到 client_id 和 client_secret。并且设置:redirect_uri,这是回调地址,php代码就是写在这个地址下。
二、链接用户跳到第三方的授权登录页,例如:
https://github.com/login/oauth/authorize? client_id=xxxxxx&redirect_uri=https://www.xxx.com/callback/github
点击这个地址会跳到回调地址,并携带url参数:code。
三、编写回调地址下的执行代码,例如:
public function github()
{
$clientID = "xxxx";
$clientSecret = "xxxxxxxxxx";
if (isset($_GET['code'])) {
$access_token_url = 'https://github.com/login/oauth/access_token';
$params = array(
'client_id' => $clientID,
'client_secret' => $clientSecret,
'code' => $_GET['code'],
);
$access_token = $this->getHttpResponsePOST($access_token_url, $params);
//var_dump($access_token);
$params = array();
parse_str($access_token, $params);
//dump($params);
if(array_key_exists('access_token', $params)){
$access_token = $params["access_token"];
}
if ($access_token) {
$info_url = 'https://api.github.com/user';
$headers[] = "User-Agent: 问老鸟";
$headers[] = "Authorization: token ".$access_token;
$result = $this->getHttpResponseGET($info_url, $headers);//返回json
$info = json_decode($result,true);//转为数组
//var_dump($info);
//判断返回结果是否授权成功,返回结果里会有一个固定的id字段,就是靠这个判断是否绑定登录
if (isset($info['id'])) {
//在oauth_github中查询是否绑定,这里可根据业务实现不同
$oauthGithubData = Db::name('oauth_github')
->where ( "github_id = '".$info['id'])
->find ();
if($oauthGithubData){
//登录标记
//具体根据业务实现
}else{
//绑定.比如把$info['id']写进oauth_github表
//具体根据业务实现
}
}
}
}
}本文用到的两个重要函数:
/**
* 远程获取数据,POST模式
* @param $url 指定URL完整路径地址
* @param $param 请求的数据
* return 远程输出的数据
*/
public function getHttpResponsePOST($url = '', $param = array()) {
if (empty($url) || empty($param)) {
return false;
}
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL,$url);//抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
$data = curl_exec($ch);//运行curl
curl_close($ch);
return $data;
}
/**
* 远程获取数据,GET模式
* 注意:
* @param $url 指定URL完整路径地址
* @param $header 头部
* return 远程输出的数据
*/
public function getHttpResponseGET($url,$header=null) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
if(!empty($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
// echo curl_getinfo($curl);
curl_close($curl);
unset($curl);
return $output;
}