Files
BookStack/app/Access/Controllers/OidcController.php

76 lines
2.1 KiB
PHP
Raw Normal View History

<?php
2023-05-17 17:56:55 +01:00
namespace BookStack\Access\Controllers;
2023-05-17 17:56:55 +01:00
use BookStack\Access\Oidc\OidcException;
use BookStack\Access\Oidc\OidcService;
use BookStack\Http\Controller;
use Illuminate\Http\Request;
2021-10-13 16:51:27 +01:00
class OidcController extends Controller
{
public function __construct(
protected OidcService $oidcService
) {
$this->middleware('guard:oidc');
}
/**
* Start the authorization login flow via OIDC.
*/
public function login()
{
try {
$loginDetails = $this->oidcService->login();
} catch (OidcException $exception) {
$this->showErrorNotification($exception->getMessage());
2022-02-24 15:04:09 +00:00
return redirect('/login');
}
session()->put('oidc_state', time() . ':' . $loginDetails['state']);
return redirect($loginDetails['url']);
}
/**
2021-10-13 16:51:27 +01:00
* Authorization flow redirect callback.
* Processes authorization response from the OIDC Authorization Server.
*/
2021-10-13 16:51:27 +01:00
public function callback(Request $request)
{
$responseState = $request->query('state');
$splitState = explode(':', session()->pull('oidc_state', ':'), 2);
if (count($splitState) !== 2) {
$splitState = [null, null];
}
[$storedStateTime, $storedState] = $splitState;
$threeMinutesAgo = time() - 3 * 60;
if (!$storedState || $storedState !== $responseState || intval($storedStateTime) < $threeMinutesAgo) {
$this->showErrorNotification(trans('errors.oidc_fail_authed', ['system' => config('oidc.name')]));
return redirect('/login');
}
try {
$this->oidcService->processAuthorizeResponse($request->query('code'));
} catch (OidcException $oidcException) {
$this->showErrorNotification($oidcException->getMessage());
2022-02-24 15:04:09 +00:00
return redirect('/login');
}
return redirect()->intended();
}
2023-08-29 13:07:21 +08:00
/**
* Log the user out, then start the OIDC RP-initiated logout process.
2023-08-29 13:07:21 +08:00
*/
public function logout()
{
return redirect($this->oidcService->logout());
2023-08-29 13:07:21 +08:00
}
}