第三方登陆(LTS)

摘要:有且不限于百度、QQ、微信、Gitee、Github、微博等

总结汇总一下第三方登陆的方法及流程

百度登陆

开发者认证

https://developer.baidu.com/
选择应用管理,创建自己的应用即可
其中的回调地址可以是本地的地址,也可以是localhost,十分方便测试
创建后保存好自己的信息

授权

百度提供了sdk与api,这里主要讲使用api
1、获取code
         $clientId = env('BAIDU_API_KEY');
         $redirectUri = env('BAIDU_REDIRECT_URI');
         header("location:https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=$clientId&redirect_uri=$redirectUri&display=popup");
2、利用code获取accesstoken
        $code = $this->getBaiduCode();
        $redirect_uri  = env('BAIDU_REDIRECT_URI');
        $client_secret = env('BAIDU_SECRET_KEY');
        $client_id     = env('BAIDU_API_KEY');
        $url           = "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=$code&client_id=$client_id&client_secret=$client_secret&redirect_uri=$redirect_uri";
        # 发送CURL,获得Access_Token
        $res           = $this->https_request($url);
        $data          = json_decode($res, true);
        $this->baiduAccessToken = $data['access_token'];
        return $data['access_token'];
3、根据token调用接口获取需要的信息(这里获取的是用户信息)
        $access_token = $accessToken;
        $url  = 'https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser?access_token='.$access_token;
        $res  = $this->https_request($url);
        $userinfo = json_decode($res, true);
        return $userinfo;
4、这里是api文档
       DOC http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_list

Github登陆

Github配置

setiting->Developer settings->GitHub Apps
可以使用本地配置的域名进行测试
获取对应的id 及key

获取code

GET 方式
        $clientId = env('GITHUB_CLIENTID');
        header("location:https://github.com/login/oauth/authorize?client_id=$clientId");

获取access_token

POST 方式请求
        $ch = curl_init();
        $data = array(
            'client_id'=>env('GITHUB_CLIENTID'),
            'client_secret'=>env('GITHUB_SECRET_KEY'),
            'code'=>$code,
            'redirect_uri'=>env('GITHUB_REDIRECT_URI'),
            'grant_type'=>'authorization_code',
        );
        $url = "https://github.com/login/oauth/access_token";
        $res = $this->https_request($url,$data);
        return $res;

获取用户信息

       CURL进行发送的时候需要携带UA参数,否则会被github驳回
       $access_token = $accessToken;
        $url  = 'https://api.github.com/user?'.$access_token;
        $res  = $this->https_request($url,null,true);
        $result = json_decode($res, true);
        return $result;
        eg:
        if($ua){
            $useragent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11";
            curl_setopt($curl, CURLOPT_USERAGENT, $useragent);        //模拟常用浏览器的useragent
        }

Gitee登陆

应用配置

设置->第三方应用
设置完成后保存对应信息。
可以使用本地域名进行开发测试

获取code

        $clientId = env('GITEE_CLIENTID');
        $redirect_uri = env('GITEE_REDIRECT_URI');
        header("location:https://gitee.com/oauth/authorize?client_id=$clientId&redirect_uri=$redirect_uri&response_type=code");

获取access_token

        $code = $this->getGiteeCode();
        $data = [
            'client_id'=>env('GITEE_CLIENTID'),
            'client_secret'=>env('GITEE_SECRET_KEY'),
            'code'=>$code,
            'redirect_uri'=>env('GITEE_REDIRECT_URI'),
            'grant_type'=>'authorization_code',
        ];
        $url = "https://gitee.com/oauth/token";
        $res = $this->https_request($url,$data);
        return json_decode($res,true)['access_token'];

获取用户信息

        $url  = 'https://gitee.com/api/v5/user?access_token='.$access_token;
        $res  = $this->https_request($url);
        $result = json_decode($res, true);
        return $result;
       这里不需要进行UA认证

QQ登陆

认证个人开发者

填写个人信息
注意:照片需要个人手持身份证,且身份证的头像在照片的右侧

创建网页应用

注意点
1、网站名称需要与备案的网站名称一致
2、需要填写备案号
3、回调地址不能是本地地址,需要在线上可以访问的地址

获取CODE

        $app_id = env('QQ_APP_ID');
        $redirect_uri = env('QQ_REDIRECT_URI');
        header("location:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=$app_id&redirect_uri=$redirect_uri");

获取AccessToken

        $client_id = env('QQ_APP_ID');
        $client_secret = env('QQ_APP_KEY');
        $redirect_uri = env('QQ_REDIRECT_URI');
        $code = $this->getQqCode();
        $url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=$client_id&client_secret=$client_secret&code=$code&redirect_uri=$redirect_uri";
        $res = $this->https_request($url);
        return $res;
这里返回的token是一个类似get传参形式的string,需要进行处理

获取OpenID

        $token = $token;
        $url = "https://graph.qq.com/oauth2.0/me?access_token=$token";
        $res = $this->https_request($url);
        $callback = trim(trim($res),'callback');
        $callback = ltrim($callback,'(');
        $callback = rtrim($callback,');');
        return json_decode($callback,TRUE);
qq返回的格式,是方便js调用的,这里需要进行处理,去除外层的信息,只留下内层的json数据

获取用户信息

        $token = $token;
        $client_id = $openid['client_id'];
        $openid_str = $openid['openid'];
        $url = "https://graph.qq.com/user/get_user_info?access_token=$token&oauth_consumer_key=$client_id&openid=$openid_str";
        $res = $this->https_request($url);
        return $res;
这里并没有类似之前的集中的uid,所以作区分需要使用openid充作platform_uid

微博登陆

认证创建应用

不支持本地测试,需要使用线上域名
在提交广场审核后会被驳回,因为广成审核已经下架,可以直接使用
你的应用“会武术的地瓜”广场未通过
驳回理由:您好,广场审核已下线,现在只要通过普通应用审核,应用就可以正常使用,所以无需再提交广场审核。请您放心使用。

获取CODE

        $client_id = env('WEIBO_APP_KEY');
        $redirect_uri = env('WEIBO_REDIRECT_URI');
        header("location:https://api.weibo.com/oauth2/authorize?client_id=$client_id&response_type=code&redirect_uri=$redirect_uri");

获取AccessToken

        $code = $this->getWeiboCode();
        $data = [
                'user_post' => 'null_post'
        ];
        $client_id = env('WEIBO_APP_KEY');
        $client_secret = env('WEIBO_APP_SECRET');
        $redirect_uri = env('WEIBO_REDIRECT_URI');
        $url = "https://api.weibo.com/oauth2/access_token?client_id=$client_id&client_secret=$client_secret&grant_type=authorization_code&code=$code&redirect_uri=$redirect_uri";
        $res = $this->https_request($url,$data);
        return $res;
踩坑点:
1、这里需要使用post数据,但是post并不提交参数,参数是由url提交的,否则会报错21323 ,提示参数找不到
2、使用post这里使用了空的,在编写的curl函数中,以为是空的,没走post方式走了get,报错10021,这时候写个post参数进去即可获取结果

获取用户信息

        $token = $accessToken['access_token'];
        $uid = $accessToken['uid'];
        $url = "https://api.weibo.com/2/users/show.json?access_token=$token&uid=$uid";
        $userinfo = $this->https_request($url);
        return $userinfo;
评论