Как увеличить сессию vue / cli 4.0.5 / vuex 3 / Laravel 6 Backend REST API-приложение? - PullRequest
1 голос
/ 20 января 2020

Я создаю приложение @ vue / cli 4.0.5 / vuex 3 со считыванием данных из Laravel 6 Backend REST API-приложение с паспортом в качестве аутентификации, и я хочу установить большее время во время сеанса во время разработки и для этого в моем приложении /Http/Controllers/AuthController.php Я изменил время и сессию

protected function respondWithToken($token)
{
    $loggedUser = $this->guard()->user();

    $user_avatar_path = User::getUserAvatarPath($loggedUser->id, $loggedUser->avatar);
    $filenameData     = User::setUserAvatarProps($loggedUser->id, $loggedUser->avatar, true);

    return response()->json([
        'access_token'     => $token,
        'user'             => $loggedUser,
        'token_type'       => 'bearer',
        'user_avatar_path' => $user_avatar_path,
        'filenameData'     => $filenameData,
        'expires_in'       => $this->guard('api')->factory()->getTTL() * 660
    ]);
}

Но, похоже, эти изменения не влияют на мое приложение. Я пропустил некоторые варианты? 2) Также, как я вижу, параметр expires_in начинает свое время со времени входа в систему, и мне кажется, что это не то, что я хочу, так как я хочу, чтобы этот параметр работал как время от последней работы в приложении. Другими словами, любой запрос к бэкэнд-части должен переосмыслить sh этот этот параметр ...

ИЗМЕНЕНО: Я прочитал в «Срок действия токена паспорта»:

По умолчанию Passport выдает долгоживущие токены доступа, срок действия которых истекает через год

Похоже, проблема не в этом, так как у меня есть опции по умолчанию (один год). Есть ли некоторые опции на стороне vuejs, когда я использую vue -ресурс

Здесь https://github.com/pagekit/vue-resource/blob/master/docs/api.md Я вижу, что vue -ресурс имеет опцию тайм-аута (число), но Я не уверен, как это применимо? Я вхожу в запрос:

 Vue.http.post(apiUrl + '/auth/login', userCredentials).then(response => {
    ...

?

MODIFIED # 2:

У меня в бэкэнд-приложении:

"php": "^7.2",
"barryvdh/laravel-cors": "^0.11.4",
"laravel/framework": "^6.2",
"laravel/passport": "^8.1",

И в части Vue / Cli:

"store": "^2.0.12",
"vue": "^2.6.10",
"vue-js-modal": "^1.3.31",
"vue-resource": "^1.5.1",
"vue-router": "^3.1.3",
"vuex": "^3.1.2"

На самом деле я хочу, чтобы в бэкэнд-приложении в config / app. php, чтобы установить некоторый параметр, например

'personal_access_tokens_expire_in_hours' => 24, // Actually I think about value = 1

, и использовать его в 2 места: в приложении / Providers / AuthServiceProvider. php:

public function boot()
{
    $this->registerPolicies();
    Passport::routes();
    $personal_access_tokens_expire_in_hours   = config('app.personal_access_tokens_expire_in_hours',24);
    Passport::personalAccessTokensExpireIn(Carbon::now()->addHours($personal_access_tokens_expire_in_hours));
}

и в приложении / Http / Controllers / AuthController. php:

public function login(Request $request)
{
    $credentials = request(['email', 'password']);
    $request->validate([
        'email'       => 'required|string|email',
        'password'    => 'required|string',
        'remember_me' => 'boolean'
    ]);

    if ( ! Auth::attempt($credentials)) {
        return response()->json(['message' => 'Unauthorized'], 401);
    }

    $user = $request->user();
    $user->last_logged= Carbon::now(config('app.timezone'));
    $user->save();
    $tokenResult = $user->createToken('Access Token');
    $token       = $tokenResult->token;

    if ($request->remember_me) {
        $personal_access_tokens_expire_in_hours   = config('app.personal_access_tokens_expire_in_hours',24);
        $token->expires_at = Carbon::now()->addHours($personal_access_tokens_expire_in_hours);
    } // Though Ronak Dhoot wrote that $token->expires_at does not infleunce anything.

Я добавил поле last_logged пользователям и заполните его при любом входе в систему.

При значении по умолчанию personalAccessTokensExpireIn через 1 день я вхожу в систему в середине моего рабочего дня. Я выключаю компьютер в конце дня и, открывая его на следующее утро, я могу войти в свое приложение с тем входом, который я сделал вчера (24 часа еще не прошло). Это кажется небезопасным для меня.

Я бы предпочел personalAccessTokensExpireIn = 1 час и переименовать sh это ЛЮБОЙ авторизованный запрос из моего приложения vue / cli. Каким образом это можно сделать? Работаете над приложениями vue / cli с baxkend api, каким способом вы пользуетесь?

У меня есть некоторая предварительная работа с auth / jwt и в app / Http / Controllers / API / AuthController. php Я нашел методы:

public function refresh() // THIS METHOD IS NOT CALLED ANYWHERE
{
    return $this->respondWithToken($this->guard()->refresh());
}

protected function respondWithToken($token)
{
    $loggedUser= $this->guard()->user();

    $user_avatar_path= User::getUserAvatarPath($loggedUser->id, $loggedUser->avatar);
    $filenameData                     = User::setUserAvatarProps($loggedUser->id, $loggedUser->avatar, true);

    $usersGroups=  User::getUsersGroupsByUserId($loggedUser->id, false);
    return response()->json([
        'access_token' => $token,
        'user'         => $loggedUser,
        'token_type'   => 'bearer',
        'user_avatar_path'   => $user_avatar_path,
        'filenameData' => $filenameData,
        'usersGroups'  => $usersGroups,
        'expires_in'   => $this->guard('api')->factory()->getTTL() * 9360 // TOFIX
    ]);
}

Можно ли как-нибудь использовать refre sh () в моем паспорте?

Спасибо!

1 Ответ

3 голосов
/ 23 января 2020

Метод createToken () создает токен личного доступа. По умолчанию срок действия этих токенов истекает через 1 год (или 100 лет, если они созданы laravel / passport <= 1.0.11). Время истечения для токена этого типа не изменяется методами Passport :: tokensExpireIn () или Passport :: refreshTokensExpireIn (). </p>

laravel / passport> = 7.0.4

В паспорт версии 7.0.4 добавлен новый метод Passport :: personalAccessTokensExpireIn (), который позволяет обновлять время истечения для токенов личного доступа. Если вы используете эту версию или более позднюю, вы можете добавить вызов этого метода в ваш метод AuthServiceProvider :: boot ().

Passport::personalAccessTokensExpireIn(Carbon::now()->addDays(1));

laravel / passport <7.0.4 </strong>

Если у вас еще нет версии 7.0.4 для паспорта, вы все равно можете изменить время истечения персонального токена, но оно более ручное. Вам нужно будет включить новый экземпляр личного доступа с желаемым сроком действия. Это также может быть сделано в вашем методе AuthServiceProvider :: boot ().

$server = $this->app->make(\League\OAuth2\Server\AuthorizationServer::class);
$server->enableGrantType(new \Laravel\Passport\Bridge\PersonalAccessGrant(), new \DateInterval('P100Y'));

Примечание :

Изменение поля expires_at в базе данных не будет что-нибудь. Реальная дата истечения срока хранения хранится внутри самого токена. Кроме того, попытка изменить утверждение exp внутри токена JWT не будет работать, так как токен подписан, и любое изменение к нему сделает его недействительным. Итак, все ваши текущие токены будут иметь свое первоначальное время истечения, и нет способа изменить это. При необходимости вам потребуется регенерировать новые токены.

PS :

Эти методы следует вызывать из boot метода вашего AuthServiceProvider.

...