网站使用 QQ、微博 第三方授权登录
现在很多网站都要不管是为了引流也好,为了用户方便也好一般都有第三方账号登陆的需求,今天以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 ID
和 App 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 Key
和 App 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;
}
}