基于thinkphp5.1关联github

前些日子,就没事玩一些关联第三方的例如QQ,微博,后来也想用微信,github一类的关联web,后来在处理github时遇到了一个棘手的问题,迟迟没有解决。这几天,就想着怎么解决这个问题,所以上午,就把这个坑给填了。

这里就不赘述如何注册github账号了。自行学习吧。提供两个与当前技术有关的网址

官方版:https://developer.github.com/v3/

中文版:https://blog.csdn.net/xiaotao745324325/article/details/41621891

直接从申请第三方账户开始。

1. 进入网址https://developer.github.com/v3/guides/getting-started/

找到这里,我框选的地方两个链接,前者的意思说创建一个个人的账户秘钥,后者是,如果你已经存在账户秘钥,就可以直接进入账户管理平台。

1.png

2. https://github.com/settings/developers

2.png

也可以在这里进行新建或者查看已有的账户秘钥。注册之后会得到一个Clinet ID ,Client Secret.可以上传应用logo,定义应用名称,,应用描述啊。还有就是返回地址一定要填。

3.png

4.png

3.做到这里,账户就申请好了,说明一点,github的流程和微博,QQ互联比起来,简洁明了,接口的通用性比较好,申请快,有台服务器就可以上线,但是作为国情需要,QQ互联和微博都需要审核开发者的资历。继续接入.下面就是程序方面的接入了。我这里用的是Thinkphp5.1和layui的x-admin。基于thinkhphp接入github。当然,主要是流程。什么语言一类的,想这么玩都行。不然怎么说是通用呢!

在登录页放入一个链接Github会回调在控制台的地址。

控制器

5.png

 /** * 应用场景:登录处理 * @return view */ public function gitcode() { $result = (new Admin)->gitlogin(request()->param()); if($result['status'] == 200){ $this->success("认证成功,跳转页面中!",url('index/index')); }else { $this->error('认证失败了哦!',url('door/login')); } } 

这里我是交给模型处理

这里面有些配置,我统一写到配置文件里,这样后期维护便利些.

6.png

// github配置

 'git'   => [ 'client_id'     => XXXXXXXXXXXXXXXXXX, 'client_secret'    => XXXXXXXXXXXXXXX, 'domain'      => 'https://github.com/login/oauth/access_token', 'acdomain'     => 'https://api.github.com/user', ], 

//我们直接在服务器去请求远程地址。

7.png

 /** * @param $url * @param int $type 0 get  1 post * @param array $data */ function doCurl($url, $type=0, $data=[],$header = 0,$token = '') { $ch = curl_init(); // 初始化 // 设置选项 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if($header == 1){ // 设置header需要发送的参数 $head = [ 'Authorization:token '.$token, 'User-Agent: Awesome-Octocat-App', ]; curl_setopt($ch, CURLOPT_HEADER,$head); }else { curl_setopt($ch, CURLOPT_HEADER,0); } if($type == 1) { // post curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } //执行并获取内容 $output = curl_exec($ch); // 释放curl句柄 curl_close($ch); return $output; } 

//这个方法和上面的方法相差无几,可以参考使用一种。

8.png

 /** * 发送HTTP请求方法 * @param  string $url    请求URL * @param  array  $params 请求参数 * @param  string $method 请求方法GET/POST * @return array  $data   响应数据 */ function httpGet($url, $params, $method = 'GET', $header = [], $multi = false){ $opts = array( CURLOPT_TIMEOUT        => 30, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER     => $header ); /* 根据请求类型设置特定参数 */ switch(strtoupper($method)){ case 'GET': $opts[CURLOPT_URL] = $url; // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params); break; case 'POST': //判断是否传输文件 $params = $multi ? $params : http_build_query($params); $opts[CURLOPT_URL] = $url; $opts[CURLOPT_POST] = 1; $opts[CURLOPT_POSTFIELDS] = $params; break; default: throw new Exception('不支持的请求方式!'); } /* 初始化并执行curl请求 */ $ch = curl_init(); curl_setopt_array($ch, $opts); $data  = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if($error) throw new Exception('请求发生错误:' . $error); return  $data; } 

4.//这里有三个请求github的链接,都需要curl请求。从登录页面使用了一次,它回调回来会传一个code。我们在第二次请求就需要带上关键项。这样会返会一个access值,生成一个来第三个链接,直接使用这个链接进行CURL请求,就可以拿到github的所有信息了。注意了,第一个问题就是,一定要携带user-agent。我之前一直没有想通的是这里。第二个问题就是,它返回的是一个json数据,需要自己在服务器解析,这样才能拿到一个数组结构。

9.png

10.png

11.png

/** * 应用场景:github登录 * @return json */ public function gitlogin($param) { if($param['code']){ $url = config('git')['domain']; $data = [ 'client_id' => config('git')['client_id'], 'client_secret' => config('git')['client_secret'], 'code' => $param['code'] ]; $access = doCurl($url,'1',$data); $api = config('git')['acdomain'].'?'.$access; $re = json_decode((httpGet($api, '', 'get', array("User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36;"))),true); $node_id = $re['node_id']; $user = $this->where('node_id',$node_id)->find(); isGitExist($re); if(!empty($user)){ $res = $this->login($user,'Github'); if($res){ return ['status' => ReturnCode::SUCCESS]; }else{ return ['status' => ReturnCode::ERROR]; } }else{ return ['status' => ReturnCode::ERROR]; } }else { return ['status' => ReturnCode::ERROR]; } } 

这样,这里的唯一标识,就是NODE_ID,至于后面的就简单了。和QQ互联,微博登录就一样的写法了。可参考我在前面两章对QQ互联和微博登陆的简述。

总结下吧!github登录和QQ互联,微博登录有些区别,GITHUB主要依靠是对它的服务器返回数据,而后两者直接验证了直接给存在了SESSION.github主要进行了三次交互,才得到一个数据组。而后两者则是请求一次远程服务器验证,就把数据存进session中,这样直接在session中取用。两者个有千秋吧!好了,就介绍这么多了!


本文链接:https://itarvin.com/detail-16.aspx

登录或者注册以便发表评论

登录

注册