PHP版Github第三方登录超详细流程及分析

软件 › 网站开发 › OAuth开发包 售价:0鸟蛋 浏览:4 时间:年前
github登录第三方登录

一、先在github的开放平台申请app的授权,得到 client_idclient_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;
}


提问 收藏 举报 2 0
评论(1)
评论
  • 还没有评论,发表第一个评论吧

0 4 2 16 2
提问 回答 资料 博客 粉丝
近期阅读