前言
很多网站登录时,允许使用第三方网站的身份,这称为"第三方登录"。
Oauth2.0协议
所谓第三方登录,实质就是 OAuth 授权。用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份。获取第三方网站的身份数据,就需要 OAuth 授权。
举例来说,A 网站允许 GitHub 登录,背后就是下面的流程。
- A 网站让用户跳转到 GitHub。
- GitHub 要求用户登录,然后询问"A 网站要求获得 xx 权限,你是否同意?"
- 用户同意,GitHub 就会重定向回 A 网站,同时发回一个授权码。
- A 网站使用授权码,向 GitHub 请求令牌。
- GitHub 返回令牌.
- A 网站使用令牌,向 GitHub 请求用户数据。
安装SDK
在您的composer.json中加入配置:
PHP >= 5.5.0
{
"require": {
"yurunsoft/yurun-oauth-login": "~3.0"
}
}
PHP < 5.5.0
{
"require": {
"yurunsoft/yurun-oauth-login": "~2.0"
}
}
下面是QQ、GitHub为例的代码授权示例
GitHub授权
1、先登录github,然后在setting中找到Developer settings,点击OAuth Apps
2、创建一个OAuth Apps 产生client_id和client_secret
应用的名称随便填,主页 URL 填写http://yourhost,跳转网址填写 http://yourhost/oauth/redirect
提交表单以后,GitHub 应该会返回客户端 ID(client ID)和客户端密钥(client secret),这就是应用的身份识别码。
QQ授权
文档地址 wiki.connect.qq.com/%e6%88%90%e…
登录QQ互联中心,申请开发者,成为开发者后申请APP得到appid、appKey、和回调地址
代码
1、将appid、appKey、回调写入配置文件
<?php
return [
//QQ
'qq' => [
'appid' => 'xxxxxxx',
'appkey' => 'xxxxxxx',
'callbackUrl' => 'xxxxxxx/qqcallback',
],
//后续登录...
//github
'github' => [
'appid' => 'xxxxxxx',
'appkey' => 'xxxxxxx',
'callbackUrl' => 'xxxxxxx/oauthcallback',
]
];
2、Laravel8 实现
<?php
namespace app\home\controller;
use app\BaseController;
use app\common\model\User as UserModel;
use think\App;
use think\Request;
use Yurun\OAuthLogin\Github\OAuth2;
class Oauth extends BaseController
{
/**
* 第三方object
* @var OAuth2|null
*/
public $Auth = null;
/**
* qq标识
*/
const OPEN_TYPE_QQ = 'qq';
/**
* github标识
*/
const OPEN_TYPE_GITHUB = 'github';
public function __construct(App $app)
{
parent::__construct($app);
//实例化第三方登录
$this->Auth = new OAuth2(config('oauth.github.appid'), config('oauth.github.appkey'), config('oauth.github.callbackUrl'));
}
//授权页面
public function oauthLogin()
{
$url = $this->Auth->getAuthUrl();
header('location:' . $url);
}
//回调处理
public function oauthcallback(Request $request)
{
// 获取accessToken 一定要写
$accessToken = $this->Auth->getAccessToken($request->get('state'));
// 用户资料
$userInfo = $this->Auth->getUserInfo();
dd($userInfo);
}
}
4、效果
github数据:
QQ数据: