lcmaquino/googleoauth2

GoogleOAuth2为Laravel添加了Google OAuth 2.0认证的服务提供者。

v1.0.6 2022-03-18 18:30 UTC

This package is auto-updated.

Last update: 2024-09-19 00:39:43 UTC


README

GoogleOAuth2是Laravel用于Google OAuth 2.0认证的包。它是基于Laravel Socialite创建的,但仅关注Google。

GoogleOAuth2实现了OAuth 2认证的主要流程

  • —— 获取来自Google认证的用户;
  • 获取用户信息——从他们的Google账户中获取用户数据;
  • 刷新令牌——刷新用户的访问令牌;
  • 撤销令牌——撤销用户的访问令牌。

有关Google OAuth 2.0的更多信息,请参阅https://developers.google.com/identity/protocols/oauth2/web-server

安装

它可以像laravel包一样正常安装

$ cd /path/to/your/laravel/root
$ composer require lcmaquino/googleoauth2
$ php artisan vendor:publish --provider="Lcmaquino\GoogleOAuth2\GoogleOAuth2Provider"

Laravel应自动将Lcmaquino\GoogleOAuth2\GoogleOAuth2Provider作为服务提供者包含,并将GoogleAuth作为Lcmaquino\GoogleOAuth2\Facades\GoogleOAuth2::class的别名包含。

可以通过手动编辑config/app.php来实现,如下所示

    'providers' => [

        //More Service Providers...

        /*
         * Package Service Providers...
         */
        Lcmaquino\GoogleOAuth2\GoogleOAuth2Provider::class,
    ],

    'aliases' => [

        //More aliases...

        'GoogleAuth' => Lcmaquino\GoogleOAuth2\Facades\GoogleOAuth2::class,
    ],

配置

在开始使用GoogleOAuth2之前,您需要设置一个OAuth 2.0客户端ID。它将为您的应用程序提供一个客户端ID、一个客户端密钥和一个重定向URI。这些参数应放置在您的Laravel配置文件.env中。

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=

当读取文件config/googleoauth2.php时,它将被您的应用程序加载

<?php

return [
    'client_id' => env('GOOGLE_CLIENT_ID', ''),
    'client_secret' => env('GOOGLE_CLIENT_SECRET', ''),
    'redirect_uri' => env('GOOGLE_REDIRECT_URI', ''),
];

路由

routes/web.php中创建两个路由

Route::get('login/google', 'Auth\LoginController@redirectToProvider');
Route::get('login/google/callback', 'Auth\LoginController@handleProviderCallback');

创建一个LoginController.php来控制这些路由

$ php artisan make:controller Auth/LoginController

打开app/Http/Controllers/Auth/LoginController.php并按以下方式编辑

<?php

namespace App\Http\Controllers\Auth;

use Lcmaquino\GoogleOAuth2\GoogleOAuth2Manager;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    public function redirectToProvider(Request $request)
    {
        $ga = new GoogleOAuth2Manager(config('googleoauth2'), $request);

        return $ga->redirect();
    }

    public function handleProviderCallback(Request $request)
    {
        $ga = new GoogleOAuth2Manager(config('googleoauth2'), $request);
        
        $user = $ga->user();

        if(empty($user)) {
            //$user is not logged in.

            //Do something.
        }else{
            //$user is logged in.

            //Do something.
        }
    }
}

当您点击路由login/google时,它将重定向您的请求到Google认证页面。Google认证将要求用户授权,然后访问您的回调路由login/google/callback

如果用户已允许您的应用程序使用他们的Google账户登录,则$user看起来像这样

Lcmaquino\GoogleOAuth2\GoogleUser {
    #sub: "1234"
    #name: null
    #email: "usermail@gmail.com"
    #emailVerified: true
    #picture: "https://something/with/code"
    #rawAttributes: array:4 [
        "sub" => "1234"
        "picture" => "https://something/with/code"
        "email" => "usermail@gmail.com"
        "email_verified" => true
    ]
    #token: "abcd1234"
    #refreshToken: null
    #expiresIn: 3599
}

有关更多信息,请参阅访问范围获取用户详情

GoogleOAuth2包含一个GoogleAuth外观。因此,您可以像这样编辑app/Http/Controllers/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use GoogleAuth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    public function redirectToProvider(Request $request)
    {
        return GoogleAuth::redirect();
    }

    public function handleProviderCallback(Request $request)
    {
        $user = GoogleAuth::user();

        if(empty($user)) {
            //$user is not logged in.

            //Do something.
        }else{
            //$user is logged in.

            //Do something.
        }
    }
}

可选参数

Google OAuth 2.0在重定向请求中支持一些可选参数。要包含任何可选参数在请求中,请使用关联数组调用with方法

$params = [
    'approval_prompt' => 'force',
];

return GoogleAuth::with($params)->redirect();

访问范围

范围用于Google限制您的应用程序访问用户账户数据。使用scopes方法设置您的范围。默认为openidemail

$scopes = [
    'openid',
    'email',
    'profile',
];

return GoogleAuth::scopes($scopes)->redirect();

无状态认证

stateless方法禁用会话状态验证。

$user = GoogleAuth::stateless()->user();

获取用户详情

一旦您有一个认证的$user,您就可以获取更多关于用户的信息

$user = GoogleAuth::user();

$user->getSub(); //the unique Google identifier for the user.
$user->getName();
$user->getEmail();
$user->emailVerified();
$user->getPicture();
$user->getToken();
$user->getRefreshToken(); //not always provided
$user->getExpiresIn();

从令牌获取用户详情

您可以使用getUserFromToken方法从有效的访问$token中检索用户详情

$user = GoogleAuth::getUserFromToken($token);

刷新令牌

访问令牌定期过期。因此,您需要获取一个新的。您可以使用refreshUserToken方法获取此令牌

$new_token = GoogleAuth::refreshUserToken($refresh_token);

您需要注意保持应用中的用户 $refresh_token。如果您丢失了它,就无法获取新的访问令牌。在这种情况下,当当前访问令牌到期时,用户需要再次登录。

您会发现,在Google身份验证中,刷新令牌并不总是提供。您可以使用 with 方法强制Google这样做(见 可选参数

$params = [
    'approval_prompt' => 'force',
    'access_type' => 'offline',
];

return GoogleAuth::with($params)->redirect();

撤销令牌

如果您需要使访问令牌和刷新令牌无效,您可以使用 revokeToken 方法撤销它们

if (GoogleAuth::revokeToken($token)) {
    //token was revoked
}else{
    //token was not revoked
}

提示

  • 您可以将有效的访问令牌或刷新令牌用作 $token
  • 记得当用户决定注销或从您的应用程序中删除他们的数据时,撤销令牌。
  • 请记住,用户始终可以在 https://myaccount.google.com/permissions 上撤销他们的令牌。

许可

GoogleOAuth2是开源软件,许可协议为GPL v3.0或更高版本,许可地址为https://github.com/lcmaquino/googleoauth2/blob/main/LICENSE