php 实现第三方登录(QQ、Github、微信)

1,951 阅读1分钟

前言

很多网站登录时,允许使用第三方网站的身份,这称为"第三方登录"。

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

参考地址 github.com/Yurunsoft/Y…

下面是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授权

文档地址 wiki.connect.qq.com/%e6%88%90%e…

登录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