mirror of
https://github.com/flarum/framework.git
synced 2025-05-22 06:39:57 +08:00

- Use cookies + CSRF token for API authentication in the default client. This mitigates potential XSS attacks by making the token unavailable to JavaScript. The Authorization header is still supported, but not used by default. - Make sensitive/destructive actions (editing a user, permanently deleting anything, visiting the admin CP) require the user to re-enter their password if they haven't entered it in the last 30 minutes. - Refactor and clean up the authentication middleware. - Add an `onhide` hook to the Modal component. (+1 squashed commit)
62 lines
1.6 KiB
PHP
62 lines
1.6 KiB
PHP
<?php
|
|
/*
|
|
* This file is part of Flarum.
|
|
*
|
|
* (c) Toby Zerner <toby.zerner@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Flarum\Http\Middleware;
|
|
|
|
use Flarum\Api\ApiKey;
|
|
use Flarum\Core\User;
|
|
use Flarum\Http\Session;
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
use Zend\Stratigility\MiddlewareInterface;
|
|
|
|
class AuthenticateWithHeader implements MiddlewareInterface
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $prefix = 'Token ';
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function __invoke(Request $request, Response $response, callable $out = null)
|
|
{
|
|
$headerLine = $request->getHeaderLine('authorization');
|
|
|
|
$parts = explode(';', $headerLine);
|
|
|
|
if (isset($parts[0]) && starts_with($parts[0], $this->prefix)) {
|
|
$id = substr($parts[0], strlen($this->prefix));
|
|
|
|
if (isset($parts[1]) && ApiKey::valid($id)) {
|
|
if ($actor = $this->getUser($parts[1])) {
|
|
$request = $request->withAttribute('actor', $actor);
|
|
}
|
|
} else {
|
|
$session = Session::find($id);
|
|
|
|
$request = $request->withAttribute('session', $session);
|
|
}
|
|
}
|
|
|
|
return $out ? $out($request, $response) : $response;
|
|
}
|
|
|
|
private function getUser($string)
|
|
{
|
|
$parts = explode('=', trim($string));
|
|
|
|
if (isset($parts[0]) && $parts[0] === 'userId') {
|
|
return User::find($parts[1]);
|
|
}
|
|
}
|
|
}
|