lcmaquino / youtubechannel
YouTubeChannel 为 Laravel 添加了与 YouTube Google 账户进行 OAuth 2.0 身份验证的服务提供者。
Requires
- php: ^7.2
- illuminate/http: ^6.0|^7.0|^8.0
- illuminate/support: ^6.0|^7.0|^8.0
- lcmaquino/googleoauth2: ^1.0.5
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
方法设置您的作用域。默认值是 openid
、email
和 https://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或更高版本许可。