【问题标题】:Passport, Method to refresh token after expiringPassport,过期后刷新令牌的方法
【发布时间】:2020-06-13 22:12:06
【问题描述】:

我正在使用 laravel v5.8、VueJS 和 passport v7.4 进行身份验证。 下面是我的登录功能:

  public function login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => 'required|string|email',
            'password' => 'required|string',
        ]);

        if ($validator->fails()) {
            return response([
                'status' => 0,
                'message' => $validator->errors()->first()
            ]);
        }

        $credentials = request(['email', 'password']);

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


        $user = $request->user();

        $tokenResult = $user->createToken('authToken');
        $token = $tokenResult->token;
        $token->save();

        $user_role = Auth::user()->user_type;
        $user->assignRole($user_role);

        return response()->json([
            'status' => 1,
            'access_token' => $tokenResult->accessToken,
            'token_type' => 'Bearer',
            'expires_at' => Carbon::parse(
                $tokenResult->token->expires_at
            )->toDateTimeString(),
        ]);
    }

我的问题是我的令牌在 10 秒后过期(这是为了测试目的)。因此,如果令牌过期,我会使用 VueJS 中的以下函数检查每条路由:

 isValid(token) {
        const payload = this.payload(token);
        if (payload) {
            const datetime = Math.floor(Date.now() / 1000);
            return payload.exp >= datetime ? true : false;
        }
        return false;
    }

所以这很好,但我应该怎么做才能刷新令牌? 我们可以制作一个中间件来自己处理吗? 或者是否有任何方法可以检测用户是否正在积极使用应用程序,例如 在基于正常会话的身份验证中?

【问题讨论】:

  • 为什么不在payload.exp 末尾附近的setTimeout(refreshToken,refreshTokenInXs) (即1 分钟/到期前的一小部分exp-time)? - 通过即/refresh 路由
  • 如果当前已过期,您尝试获取新的刷新令牌如何?
  • 是的,我知道这个想法,但我担心的是控制器中的令牌验证功能。当我们使用这种身份验证而不是来自护照的“/oauth/token”路由时,我找不到任何功能
  • *令牌刷新功能
  • 你为什么要使用自己的登录控制器。 laravel 护照不提供默认登录吗

标签: laravel vue.js laravel-passport


【解决方案1】:

看起来你正在重新发明轮子,我建议向护照 /oauth/token 发出请求,然后返回 access_token 和刷新令牌。为了摆脱构建身份验证控制层,我正在使用 nuxtjs。

以下示例需要 guzzlehttp/guzzle 包。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\User;
use Illuminate\Http\Request;
use GuzzleHttp\Client;

class AuthController extends Controller
{

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function user(Request $request)
    {
        return response()->json(['user' => new User($request->user())]);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse|\Psr\Http\Message\StreamInterface
     */
    public function login (Request $request)
    {

        $http = new Client;

        try {
            $response = $http->post(config('app.url') . '/oauth/token', [
                'form_params' => [
                    'grant_type'    => 'password',
                    'client_id'     => '2',
                    'client_secret' => 'ugjAn1BD4Cs8gAP63RqixyCOD3Z1dUrrNiEgxQtN',
                    'username'      => $request->get('email'),
                    'password'      => $request->get('password')
                ]
            ]);

            return $response->getBody();
        } catch (\GuzzleHttp\Exception\BadResponseException $e) {
            if (400 === $e->getCode()) {
                return response()->json(['message' => 'Invalid request. Please enter username and password'], $e->getCode());
            } else if (401 === $e->getCode()) {
                return response()->json([message' => 'Your credentials are incorrect. Please try again.'], $e->getCode());
            }
        }

        return response()->json(['message' => 'Something went wrong please try again later. ' . $e->getMessage()], $e->getCode());
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    function logout (Request $request)
    {
        $request->user()->tokens->each(function ($token, $key) {
            $token->delete();
        });

        return response()->json(['message' => 'Logged out successfully'], 200);
    }
}

【讨论】:

  • 是的其实我知道这个方法,但是有什么方法可以使用普通的Auth门面登录吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2018-02-10
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2017-03-04
相关资源
最近更新 更多