我们可以将 socialite 与 laravel 的背包互动吗?
Can we interate socialite with backpack for laravel?
我们只需要通过 OpenId(确切地说是 Microsoft Azure AD OpenId Connect)登录用户。
我们知道如何使用 Socialite,但我们想与 Backpack For Laravel 集成,因为应用程序是 90% 的基本内容,而且我们已经有付费许可证。
如何将 socialite 与 laravel 的背包集成?
- 另外...我们应该将其与 laravel-permissions 集成,它很容易与 laravel
的背包集成
如果您需要socialite,我建议您完全不要使用 Backpack 身份验证。只需在 config/backpack/base.php 文件(主要是路由)中禁用与身份验证相关的所有内容,使用 socialite 编写您自己的控制器逻辑,并在同一配置中插入您自己的身份验证中间件和守卫文件,以便 Backpack 使用您的身份验证而不是默认身份验证。
编写代码和维护自己的逻辑会更容易,而不是破坏默认身份验证以按照您想要的方式工作。
警告:此答案正在进行中,可能不完整。
我们把 9 个月前做的放在这里,但我们不能确定 100% 写下整合社交名流所需的内容
config\backpack\base.php
'guard' => null,
.env
AZURE_CLIENT_ID=0e8b592f-asaaaasd4eac-a368-d0d52dbc14e0
AZURE_CLIENT_SECRET=b2r5442
AZURE_REDIRECT_URI=/sso/callback
config\services.php
// See https://socialiteproviders.com/Microsoft-Azure/#installation-basic-usage
'azure' => [
'client_id' => env('AZURE_CLIENT_ID'),
'client_secret' => env('AZURE_CLIENT_SECRET'),
'redirect' => env('AZURE_REDIRECT_URI')
],
已安装的软件包:
"laravel/socialite": "^5.2",
"lcobucci/jwt": "^4.1",
"socialiteproviders/microsoft-azure": "^4.2",
routes\web.php
Route::get('/login', [\App\Http\Controllers\AuthController::class, 'login'])->name('login');
Route::get('/sso/callback', [\App\Http\Controllers\AuthController::class, 'ssoCallback']);
app/Http/Controllers/AuthController.php
use Laravel\Socialite\Facades\Socialite;
use Lcobucci\JWT\Configuration;
....
public function login()
{
return Socialite::driver('azure')->scopes(['openid'])->redirect();
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect("https://login.microsoftonline.com/common/oauth2/v2.0/logout");
}
public function ssoCallback()
{
try {
$user = Socialite::driver('azure')->user();
}
catch (\Laravel\Socialite\Two\InvalidStateException $e) {
return redirect(route('login'));
}
catch (\GuzzleHttp\Exception\ClientException $e) {
return redirect(route('login'));
}
// Read the claims from token JWT using Lcobucci\JWT package
$configuration = Configuration::forUnsecuredSigner();
$token = $configuration->parser()->parse( $user->accessTokenResponseBody["id_token"] );
$claims = $token->claims()
// This is an example, it depends by your jwt
$full_name = $user->name;
$email = $user->email;
$app_user = User::firstOrCreate([
'name' => $full_name,
'email' => $email,
]);
auth()->login($app_user);
}
我们只需要通过 OpenId(确切地说是 Microsoft Azure AD OpenId Connect)登录用户。
我们知道如何使用 Socialite,但我们想与 Backpack For Laravel 集成,因为应用程序是 90% 的基本内容,而且我们已经有付费许可证。
如何将 socialite 与 laravel 的背包集成?
- 另外...我们应该将其与 laravel-permissions 集成,它很容易与 laravel 的背包集成
如果您需要socialite,我建议您完全不要使用 Backpack 身份验证。只需在 config/backpack/base.php 文件(主要是路由)中禁用与身份验证相关的所有内容,使用 socialite 编写您自己的控制器逻辑,并在同一配置中插入您自己的身份验证中间件和守卫文件,以便 Backpack 使用您的身份验证而不是默认身份验证。
编写代码和维护自己的逻辑会更容易,而不是破坏默认身份验证以按照您想要的方式工作。
警告:此答案正在进行中,可能不完整。 我们把 9 个月前做的放在这里,但我们不能确定 100% 写下整合社交名流所需的内容
config\backpack\base.php
'guard' => null,
.env
AZURE_CLIENT_ID=0e8b592f-asaaaasd4eac-a368-d0d52dbc14e0
AZURE_CLIENT_SECRET=b2r5442
AZURE_REDIRECT_URI=/sso/callback
config\services.php
// See https://socialiteproviders.com/Microsoft-Azure/#installation-basic-usage
'azure' => [
'client_id' => env('AZURE_CLIENT_ID'),
'client_secret' => env('AZURE_CLIENT_SECRET'),
'redirect' => env('AZURE_REDIRECT_URI')
],
已安装的软件包:
"laravel/socialite": "^5.2",
"lcobucci/jwt": "^4.1",
"socialiteproviders/microsoft-azure": "^4.2",
routes\web.php
Route::get('/login', [\App\Http\Controllers\AuthController::class, 'login'])->name('login');
Route::get('/sso/callback', [\App\Http\Controllers\AuthController::class, 'ssoCallback']);
app/Http/Controllers/AuthController.php
use Laravel\Socialite\Facades\Socialite;
use Lcobucci\JWT\Configuration;
....
public function login()
{
return Socialite::driver('azure')->scopes(['openid'])->redirect();
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect("https://login.microsoftonline.com/common/oauth2/v2.0/logout");
}
public function ssoCallback()
{
try {
$user = Socialite::driver('azure')->user();
}
catch (\Laravel\Socialite\Two\InvalidStateException $e) {
return redirect(route('login'));
}
catch (\GuzzleHttp\Exception\ClientException $e) {
return redirect(route('login'));
}
// Read the claims from token JWT using Lcobucci\JWT package
$configuration = Configuration::forUnsecuredSigner();
$token = $configuration->parser()->parse( $user->accessTokenResponseBody["id_token"] );
$claims = $token->claims()
// This is an example, it depends by your jwt
$full_name = $user->name;
$email = $user->email;
$app_user = User::firstOrCreate([
'name' => $full_name,
'email' => $email,
]);
auth()->login($app_user);
}