一、创建 Github 应用
https://github.com/settings/apps


创建应用成功得到 Client ID 和 Client Secret

二、代码实现:
思路:
首先我们申请完应用后会有Client ID和Client Secret
1、通过这两个参数我们去访问:https://github.com/login/oauth/authorize?client_id='你的client id',访问后会返回一个code到我们的创建应用的时候填写的那个callback回调地址。
2、有了code,我们在通过Client ID和Client Secret和code这三个参数去访问:https://github.com/login/oauth/access_token?code=''&client=''&client secret='',这时会返回一个access_token:
3、有了access_token我们在去访问:https://api.github.com/user?access_token='',这时,就能以json格式返回给我们所有的用户信息了~
(1)前端页面放置按钮:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta charset="utf-8"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>tetu</title>
</head>
<body>
<h3>第三方登录</h3>
<div class="row other">
<div class="large-9 columns left">
<button type="button" class="button tiny defalt expand" onclick="githubLogin();">GitHub登录</button>
</div>
</div>
<script>
function githubLogin(){
//以下为按钮点击事件的逻辑。注意这里要重新打开窗口
//否则后面跳转到github登录,授权页面时会直接缩小当前浏览器的窗口,而不是打开新窗口
window.location.href="/index/user/githublogin.html";
}
</script>
</body>
</html>(2)后端代码:
// github登录
public function githubLogin(){
$client_id='client_id';
$client_secret='client_secret';
header('location:https://github.com/login/oauth/authorize?client_id='.$client_id.'&client_secret='.$client_secret.'&scope=user:email');
}
public function Callback(){
$client_id='client_id';
$client_secret='client_secret';
$code=input('code');
$access_token=$this->curl("https://github.com/login/oauth/access_token?client_id=".$client_id."&client_secret=".$client_secret."&code=".$code);
// header("location:https://api.github.com/user?$token");
$info_url = 'https://api.github.com/user?'.$access_token;
$arrydata = array();
$arrydata = $this->curl($info_url);
parse_str($access_token,$arrydata);
$token = $arrydata['access_token'];
$url = "https://api.github.com/user?access_token=".$token;
$headers[] = 'Authorization: token '.$token;
$headers[] = "User-Agent: 简忆博客";
$result = $this->curl($info_url,[],$headers);
$info = json_decode($result,true);
if (isset($info['id'])) {
// 处理获取到的数据
var_dump($info);
}
}
public function curl($url,$postData=[],$headers=[]){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url); //要访问的地址
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //执行结果是否被返回,0返,1不返
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
if($postData){
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
}
if(curl_exec($ch)==false){
$data='';
}
else{
$data=curl_multi_getcontent($ch);
}
curl_close($ch);
return $data;
}