lcmaquino / googleoauth2
GoogleOAuth2为Laravel添加了Google OAuth 2.0认证的服务提供者。
Requires
- php: ^7.2
- illuminate/http: ^6.0|^7.0|^8.0
- illuminate/support: ^6.0|^7.0|^8.0
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
方法设置您的范围。默认为openid
和email
。
$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。