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" } }

参考地址 https://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授权

文档地址 https://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