首页
归档
笔记
树洞
搜索
友言

文章详情

Interesting People Record Interesting.

/ PHP / 文章详情

网站使用 QQ、微博 第三方授权登录

Sonder
2020-04-06
8313字
21分钟
浏览 (3.7k)

现在很多网站都要不管是为了引流也好,为了用户方便也好一般都有第三方账号登陆的需求,今天以QQ登陆为例,来实现一个最简单的第三方登陆。

目前主流的第三方登录都是依赖的Oauth2.0实现的,最常见的就是在各种中小型网站或者App中的QQ登录,微信登录等等。所以我建议想要学习和实现第三方登录同学去了解下这个协议。

在使用QQ实现第三方登陆之前首先要了解一个重要概念,那就是什么是Oauth2.0(理解OAuth 2.0 - 阮一峰)

QQ授权登录步骤

1、到QQ开放平台注册账号并实名认证,地址:https://connect.qq.com/index.html发现这里有个坑,qq互联怎么认证https://zhidao.baidu.com/question/1515524660887521100.html

2、创建应用 -> 网址应用(注意项:网站名称一定要是备案时网站名称,要不审核不通过 你可以在这里查询的到:http://icp.chinaz.com/

3、拿到应用的 App IDApp Key

4、QQ 登录授权文档地址:https://wiki.connect.qq.com/

5、QQ 登录授权官方sdk包:https://wiki.connect.qq.com/sdk下载

6、以下是我个人写的 QQ 登录授权,仅供参考

复制代码
<?php
/**
* QQ Oauth2.0 授权登录处理
* date 2019-07-26
*/
namespace oauth;

class qq
{
   private $app_id     = '';                               // QQ应用的 App ID
   private $app_key    = '';                               // QQ应用的 App Key
   private $oauth2_url = 'https://graph.qq.com/oauth2.0';  // QQ OAuth2.0接口URL地址
   private $api2_url   = 'https://graph.qq.com';

   /**
    * 设置Key 和 Secret,如果为空,默认读取config/oauth.php文件里的 qq_app_id和qq_app_key
    *
    * @param array $config 微博应用的Key和Secret值
    */
   public function __construct($config = [])
   {
       $this->app_id  = !empty($config['app_id']) ? $config['app_id'] : config('oauth.qq_app_id');
       $this->app_key = !empty($config['app_key']) ? $config['app_key'] : config('oauth.qq_app_key');
   }

   /**
    * 微博授权跳转URL
    * @param  string $redirect_uri 授权回调地址
    * @param  string $state        回调带回参数,防止CSRF攻击
    * @return mixed
    */
   public function authorize($redirect_uri = '', $state = '')
   {
       if (empty($redirect_uri)) return false;

       $url = $this->oauth2_url . '/authorize?client_id=' . $this->app_id . '&redirect_uri=' . $redirect_uri;
       $url = $url . '&response_type=code&state=' . $state;
       header('location: ' . $url);
   }

   /**
    * 获取微博access_token值
    * @param  string $redirect_uri 授权回调地址
    * @param  string $code         通过authorize获取的code值
    * @return mixed
    */
   public function getAccessToken($redirect_uri = '', $code = '')
   {
       if (empty($redirect_uri) || empty($code)) return false;

       $url = $this->oauth2_url . '/token?grant_type=authorization_code&client_id=' . $this->app_id;
       $url = $url . '&client_secret=' . $this->app_key . '&redirect_uri=' . $redirect_uri . '&code=' . $code;

       $res_str = \util\Curl::curlGetRequest($url);

       if (strpos($res_str, "callback") !== false) {
           $lpos    = strpos($res_str, "(");
           $rpos    = strrpos($res_str, ")");
           $res_str = substr($res_str, $lpos + 1, $rpos - $lpos -1);
           $res_arr = json_decode($res_str, true);

           $res_arr['error_code'] = isset($res_arr['error']) ? $res_arr['error'] : '';
           $res_arr['error']      = isset($res_arr['error_description']) ? $res_arr['error_description'] : '';
           $res_json              = json_encode($res_arr);
       } else {
           $params = array();
           parse_str($res_str, $params);   // 把传回来的数据参数变量化
           // 通过access_token获取用户的openID
           $ret_json = $this->_getOpenId($params['access_token']);
           $ret_data = json_decode($ret_json, true);
           if (!empty($ret_data['error'])) {
               $params               = [];
               $params['error_code'] = $ret_data['error'];
               $params['error']      = $ret_data['error_description'];
           } else {
               $params['openid'] = $ret_data['openid'];
           }
           $res_json = json_encode($params);
       }

       // 整理返回数据
       $res_data = [
           'app_account' => ['app_key' => $this->app_id, 'app_secret' => $this->app_key],
           'res_json'    => $res_json
       ];

       return $res_data;
   }

   /**
    * 获取openID
    * @param  string $access_token token值
    * @return json|void|array
    */
   private function _getOpenId($access_token = '')
   {
       $url     = $this->oauth2_url . '/me?access_token=' . $access_token;
       $res_str = \util\Curl::curlGetRequest($url);

       if (strpos($res_str, "callback") !== false) {
           $lpos    = strpos($res_str, "(");
           $rpos    = strrpos($res_str, ")");
           $res_str = substr($res_str, $lpos + 1, $rpos - $lpos -1);
       }

       return $res_str;
   }

   /**
    * 根据access_token和用户id获取用户信息
    * @param  string $access_token token值
    * @param  string $openid       QQ用户openID
    * @return array|void
    */
   public function getUserInfo($access_token = '', $openid = '')
   {
       if (!$access_token || !$openid) return false;

       $url = $this->api2_url . '/user/get_user_info?access_token=' . $access_token . '&openid=' . $openid . '&oauth_consumer_key=' . $this->app_id;
       $res = \util\Curl::curlGetRequest($url);

       return $res;
   }

}

里面使用到 curl,大家可按照自己的习惯使用

相关文章:https://zhuanlan.zhihu.com/p/35651406
转载来自:http://www.baiyongj.com/news/509.html

微博授权登录步骤

1、到微博开放平台注册账号并实名认证,地址:https://open.weibo.com/

2、创建应用,网站授权登录需要创建的类型为:微连接 - 网页应用。

3、拿到应用的 App KeyApp Secret

4、微博登录授权文档地址:https://open.weibo.com/wiki/Connect/login

5、可以现在微博官方提供的 sdk 包,也可以自己参考文档写

6、以下是我个人写的微博登录授权,仅供参考

复制代码
<?php
/**
* 微博 Oauth2.0 授权登录处理
* date 2019-07-17
*/
namespace oauth;

class weibo
{
   private $app_key    = '';                               // 微博应用的 App Key
   private $app_secret = '';                               // 微博应用的 App Secret
   private $oauth2_url = 'https://api.weibo.com/oauth2';   // 微博OAuth2.0接口URL地址
   private $api2_url   = 'https://api.weibo.com/2';

   /**
    * 设置Key 和 Secret,如果为空,默认读取config/oauth.php文件里的 weibo_app_key和weibo_app_secret
    *
    * @param array $config 微博应用的Key和Secret值
    */
   public function __construct($config = [])
   {
       $this->app_key    = !empty($config['app_key']) ? $config['app_key'] : config('oauth.weibo_app_key');
       $this->app_secret = !empty($config['app_secret']) ? $config['app_secret'] : config('oauth.weibo_app_secret');
   }

   /**
    * 微博授权跳转URL
    * @param  string $redirect_uri 授权回调地址
    * @param  string $state        回调带回参数,防止CSRF攻击
    * @return mixed
    */
   public function authorize($redirect_uri = '', $state = '')
   {
       if (empty($redirect_uri)) return false;

       $url = $this->oauth2_url . '/authorize?client_id=' . $this->app_key . '&redirect_uri=' . $redirect_uri;
       $url = $url . '&response_type=code&state=' . $state;

       header('location: ' . $url);
   }

   /**
    * 获取微博access_token值
    * @param  string $redirect_uri 授权回调地址
    * @param  string $code         通过authorize获取的code值
    * @return mixed
    */
   public function getAccessToken($redirect_uri = '', $code = '')
   {
       if (empty($redirect_uri) || empty($code)) return false;

       $params = [
           'client_id'     => $this->app_key,
           'client_secret' => $this->app_secret,
           'grant_type'    => 'authorization_code',
           'redirect_uri'  => $redirect_uri,
           'code'          => $code,
       ];
       $url = $this->oauth2_url . '/access_token';
       $res = \util\Curl::curlPostRequest($url, $params);

       // 整理返回数据
       $res_data = [
           'app_account' => ['app_key' => $this->app_key, 'app_secret' => $this->app_secret],
           'res_json'    => $res
       ];

       return $res_data;
   }

   /**
    * 根据access_token和用户id获取用户信息
    * @param  string  $access_token token值
    * @param  integer $uid          微博用户id
    * @return array|void
    */
   public function getUserInfo($access_token = '', $uid = 0)
   {
       if (!$access_token || !$uid) return false;

       $url = $this->api2_url . '/users/show.json?access_token=' . $access_token . '&uid=' . $uid;
       $res = \util\Curl::curlGetRequest($url);

       return $res;
   }
}

转载来自:http://www.baiyongj.com/news/507.html

下一篇 / 百度UEditor编辑器如何去除自动默认添加的p标签

🎯 相关文章

💡 推荐文章

🕵️‍♂️ 评论 (0)