php 實現第三方登入(QQ、Github、微信)

語言: CN / TW / HK

theme: juejin highlight: a11y-light


前言

很多網站登入時,允許使用第三方網站的身份,這稱為"第三方登入"。

image.png

Oauth2.0協議

所謂第三方登入,實質就是 OAuth 授權。使用者想要登入 A 網站,A 網站讓使用者提供第三方網站的資料,證明自己的身份。獲取第三方網站的身份資料,就需要 OAuth 授權。

舉例來說,A 網站允許 GitHub 登入,背後就是下面的流程。

  1. A 網站讓使用者跳轉到 GitHub。
  2. GitHub 要求使用者登入,然後詢問"A 網站要求獲得 xx 許可權,你是否同意?"
  3. 使用者同意,GitHub 就會重定向回 A 網站,同時發回一個授權碼。
  4. A 網站使用授權碼,向 GitHub 請求令牌。
  5. GitHub 返回令牌.
  6. 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

image.png

2、建立一個OAuth Apps 產生client_id和client_secret

image.png

應用的名稱隨便填,主頁 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、和回撥地址

image.png

程式碼

1、將appid、appKey、回撥寫入配置檔案

<?php return [ //QQ 'qq' => [ 'appid' => 'xxxxxxx', 'appkey' => 'xxxxxxx', 'callbackUrl' => 'xxxxxxx/qqcallback', ], //後續登入... //github 'github' => [ 'appid' => 'xxxxxxx', 'appkey' => 'xxxxxxx', 'callbackUrl' => 'xxxxxxx/oauthcallback', ] ];

image.png

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資料:

image.png

QQ資料:

image.png