php 實現第三方登入(QQ、Github、微信)
theme: juejin highlight: a11y-light
前言
很多網站登入時,允許使用第三方網站的身份,這稱為"第三方登入"。
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"
}
}
參考地址 http://github.com/Yurunsoft/YurunOAuthLogin
下面是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授權
文件地址 http://wiki.connect.qq.com/%e6%88%90%e4%b8%ba%e5%bc%80%e5%8f%91%e8%80%85
登入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資料: