lcmaquino/youtubechannel

YouTubeChannel 为 Laravel 添加了与 YouTube Google 账户进行 OAuth 2.0 身份验证的服务提供者。

v1.0.7 2021-01-29 16:22 UTC

This package is auto-updated.

Last update: 2024-09-29 05:56:14 UTC


README

YouTubeChannel 为 Laravel 添加了与 YouTube Google 账户进行 OAuth 2.0 身份验证的服务提供者。

它基于 GoogleOAuth2 创建,这是一个用于通过 Google 账户进行 OAuth 2.0 身份验证的 Laravel 扩展包。

特性

  • GoogleOAuth2 相同的功能;
  • 检查用户是否已订阅特定的 YouTube 频道;
  • 获取一些 YouTube 频道的统计数据:订阅数、观看次数和视频数。

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

安装

$ cd /path/to/your/laravel/root
$ composer require lcmaquino/youtubechannel
$ php artisan vendor:publish --provider="Lcmaquino\YouTubeChannel\YouTubeChannelProvider"

Laravel 应自动包含 Lcmaquino\YouTubeChannel\YouTubeChannelProvider 作为服务提供者,并将 YouTubeChannel 作为 Lcmaquino\YouTubeChannel\Facades\YouTubeChannel::class 的别称包含在内。

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

    'providers' => [

        //More Service Providers...

        /*
         * Package Service Providers...
         */
        Lcmaquino\YouTubeChannel\YouTubeChannelProvider::class,
    ],

    'aliases' => [

        //More aliases...

        'YouTubeChannel' => Lcmaquino\YouTubeChannel\Facades\YouTubeChannel::class,
    ],

配置

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

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=
YOUTUBE_CHANNEL_ID=

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

<?php

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

路由

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

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

创建 app/Http/Controllers/Auth/LoginController.php 并按照以下方式编辑

<?php

namespace App\Http\Controllers\Auth;

use Lcmaquino\YouTubeChannel\YouTubeChannelManager;

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

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

        return $ytm->redirect();
    }

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

        if(empty($user)) {
            //user not authenticaded

            //do something
        }else{
            //user authenticaded

            $subscribed = $ytm->isUserSubscribed();

            if ($subscribed === null) {
                //something went wrong

            } else {
                if ($subscribed) {
                    //user subscribed

                    //do something
                } else {
                    //user not subscribed

                    //do something
                }
            }
        }
    }
}

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

YouTubeChannel 随附 YouTubeChannel 门面。因此,您可以像这样编辑 app/Http/Controllers/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use YouTubeChannel;

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

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

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

        if(empty($user)) {
            //user not authenticaded

            //do something
        }else{
            //user authenticaded

            $subscribed = YouTubeChannel::isUserSubscribed();

            if ($subscribed === null) {
                //something went wrong

            } else {
                if ($subscribed) {
                    //user subscribed

                    //do something
                } else {
                    //user not subscribed

                    //do something
                }
            }
        }
    }
}

可选参数

要包含请求中的任何可选 OAuth 2.0 参数,请使用关联数组调用 with 方法

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

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

访问作用域

作用域用于 Google 限制您的应用程序对用户账户数据的访问。使用 scopes 方法设置您的作用域。默认值是 openidemailhttps://www.googleapis.com/auth/youtube.readonly

$scopes = [
    'profile',
    'openid',
    'email',
    'https://www.googleapis.com/auth/youtube',
    'https://www.googleapis.com/auth/youtube.readonly'
];

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

有关 YouTube 数据 API 作用域的更多信息。

无状态身份验证

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

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

检索用户详情

一旦您拥有一个经过身份验证的 $user,您就可以获取更多有关用户的信息

$user = YouTubeChannel::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 = YouTubeChannel::getUserFromToken($token);

刷新令牌

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

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

您应该注意保留应用程序中的用户 $refresh_token。如果您丢失了它,那么您就无法获取新的访问令牌。在这种情况下,当当前访问令牌过期时,用户必须再次登录。

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

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

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

撤销令牌

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

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

提示

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

许可协议

YouTubeChannel是开源软件,根据GPL v3.0或更高版本许可。