Аутентификация пользователя в конструкторе

Я хочу выполнить аутентификацию по токену в любом url. Эта проверка подлинности вызывается перед маршрутами, и маркер хранится в таблице пользователи (поле token).

При доступе к URLmysite.com/backend/?token=XXX&anyparam=any-адресу , если токен действителен, пользователь должен быть перенаправлен на mysite.com/backend/?anyparam=any.

Я пытаюсь выполнить аутентификацию на конструкторе контроллера, поэтому, если URL имеет допустимый маркер (который соответствует маркеру пользователя), пользователь должен быть аутентифицирован.

public function __construct(Request $request)
{
    // url with token
    if($request->has('token')) {
        $new_url = $request->url() . '/?' . http_build_query($request->except(['token']));

        $user = User::where('token', $request->input('token'))->first();

        Auth::login($user);
        //dd(Auth::user()); // says the user is authenticated
        return redirect($new_url)->send();
    }
}

Однако после перенаправления пользователь больше не проходит проверку подлинности.

Чего мне не хватает?

Кроме того, процесс генерации токенов не имеет ничего общего с этой проблемой.

1 ответ

  1. Я бы сказал, что лучшим решением является использование промежуточного ПО. Если по какой-то причине вы хотите, чтобы это было частью __construct, вы можете вызвать промежуточное программное обеспечение от контроллера, как указано в документации .

    Таким образом, ваш контроллер будет чем-то вроде:

    public function __construct(Request $request)
    {
        $this->middleware('auth');
    }
    

    И промежуточное программное обеспечение Auth (класс Authenticate) будет иметь что-то вроде:

    public function handle($request, Closure $next, $guard = null)
    {
        if($request->has('token')) {
            $new_url = $request->url() . '/?' . http_build_query($request->except(['token']));
            $user = User::where('token', $request->input('token'))->first();
    
            if (is_object($user)) {
                Auth::login($user);
    
                return redirect()->to($new_url);
            }
        }
    
        return $next($request);
    }
    

    Если вы не хотите связываться с authвами, вы всегда можете создать другое промежуточное программное обеспечение .