Выдача токенов доступа с паспортом в течение ограниченного срока - PullRequest
0 голосов
/ 30 декабря 2018

Backend : Laravel api. Frontend : Angular.

После настройки пакета Passport на Laravel я использую обычный способ аутентификации пользователя, затем выдаю токен следующим образом:

 $newToken = $user->createToken('myapp')->accessToken;

это работает нормальноно проблема заключается в том, что срок службы токена составляет 1 год, поскольку он рассматривал токены личного доступа и, как указано в документации:

токены личного доступа всегда являются долгоживущими.Их время жизни не изменяется при использовании методов tokensExpireIn или refreshTokensExpireIn.

У меня вопрос, как я могу выдать токен для моего пользователя в моем приложении с ограниченным временем жизни?

с другой стороныкажется опасным выставлять client_secred и client_id, поэтому я не могу позвонить oauth/token из моего углового приложения

1 Ответ

0 голосов
/ 04 января 2019

Я уверен, что это не лучшее решение, но это то, что я придумал, большое спасибо за восемьдесят пять ответ:

сначала добавьте этот защищенный метод в свой контроллер аутентификации.

protected function oauthLogin(Request $request)    
{
    $client = DB::table('oauth_clients')
        ->where('password_client', true)
        ->first();    
    $request->request->add([
        "grant_type" => "password",
        "username" => $request->email,
        "password" => $request->password,
        "client_id" => $client->id,
        "client_secret" => $client->secret,
    ]);    
    $tokenRequest = $request->create(
        env('APP_URL') . '/oauth/token',
        'post'
    );    
    $instance = Route::dispatch($tokenRequest);    
    return json_decode($instance->getContent());    
}

затем вызовите метод внутри метода входа в систему только после аутентификации пользователя:

public function login(Request $request)
    {

        $credentials = $request->only('email', 'password');
        try {
            // verify the credentials and create a token for the user
            if ($token = Auth::guard('web')->attempt($credentials)) {

                $user = Auth::guard('web')->user();

                $roles = $user->roles()->get()->pluck('name');

                $accessToken = $this->oauthLogin($request)->access_token; // instead of $user->createToken('token')->accessToken,

                return response()->json([
                    'token' => $accessToken,
                    'roles' => $roles,
                    'email' => $request->input('email')
                ]);
            } else {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (Exception $e) {
            // something went wrong
            return response()->json(['error' => 'could_not_create_token'], 500);
        }
    }

таким образом, выданный токен ограничен временем, установленным в AuthServiceProvider.php:

public function boot()
    {
        $this->registerPolicies();

        //
        Passport::routes();

        Passport::tokensExpireIn(now()->addHour(1));

        Passport::refreshTokensExpireIn(now()->addHour(1));

    }
...