我们可以将 socialite 与 laravel 的背包互动吗?

Can we interate socialite with backpack for laravel?

我们只需要通过 OpenId(确切地说是 Microsoft Azure AD OpenId Connect)登录用户。

我们知道如何使用 Socialite,但我们想与 Backpack For Laravel 集成,因为应用程序是 90% 的基本内容,而且我们已经有付费许可证。

如何将 socialite 与 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);
}