2FAuth/app/Services/Auth/ReverseProxyGuard.php

94 lines
2.7 KiB
PHP
Raw Normal View History

<?php
// Largely inspired by Firefly III remote user implementation (https://github.com/firefly-iii)
// See https://github.com/firefly-iii/firefly-iii/blob/main/app/Support/Authentication/RemoteUserGuard.php
namespace App\Services\Auth;
2022-11-22 15:15:52 +01:00
use Illuminate\Auth\GuardHelpers;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Support\Facades\Log;
class ReverseProxyGuard implements Guard
{
use GuardHelpers;
/**
* The currently authenticated user.
*
* @var \Illuminate\Contracts\Auth\Authenticatable|null
*/
protected $user;
/**
* Create a new authentication guard.
*
* @return void
*/
public function __construct(UserProvider $provider)
{
$this->provider = $provider;
}
/**
2022-11-22 15:15:52 +01:00
* {@inheritDoc}
*/
public function user()
{
// If we've already retrieved the user for the current request we can just
// return it back immediately. We do not want to fetch the user data on
// every call to this method because that would be tremendously slow.
if (! is_null($this->user)) {
return $this->user;
}
// Get the user identifier from $_SERVER or apache filtered headers
$remoteUserHeader = config('auth.auth_proxy_headers.user');
$remoteUserHeader = $remoteUserHeader ?: 'REMOTE_USER';
2022-11-22 15:15:52 +01:00
$identifier = [];
2022-03-31 08:38:35 +02:00
try {
$identifier['id'] = request()->server($remoteUserHeader) ?? apache_request_headers()[$remoteUserHeader] ?? null;
2022-11-22 15:15:52 +01:00
} catch (\Throwable $e) {
$identifier['id'] = null;
2022-03-31 08:38:35 +02:00
}
if (! $identifier['id'] || is_array($identifier['id'])) {
Log::error(sprintf('Proxy remote-user header %s is empty or missing.', var_export($remoteUserHeader, true)));
2022-11-22 15:15:52 +01:00
return $this->user = null;
}
// Get the email identifier from $_SERVER
$remoteEmailHeader = config('auth.auth_proxy_headers.email');
$identifier['email'] = null;
if ($remoteEmailHeader) {
2022-03-31 08:38:35 +02:00
try {
2022-11-22 15:15:52 +01:00
$remoteEmail = (string) (request()->server($remoteEmailHeader) ?? apache_request_headers()[$remoteEmailHeader] ?? null);
} catch (\Throwable $e) {
2022-03-31 08:38:35 +02:00
$remoteEmail = null;
}
if ($remoteEmail) {
$identifier['email'] = $remoteEmail;
}
}
return $this->user = $this->provider->retrieveById($identifier);
}
/**
* Validate a user's credentials.
*
* @return bool
2022-11-22 15:15:52 +01:00
*
2022-03-31 08:38:35 +02:00
* @codeCoverageIgnore
*/
public function validate(array $credentials = [])
{
return $this->check();
}
}