0

我想知道如何在 Laravel 5.6 中使用 Cartalyst Sentinel 2.0 身份验证包实现 tymon jwt 1.0.0 rc2,以利用节流和其他 Sentinel 功能。

在 AuthController 内部,我有 jwt-auth 文档中提到的 login() 方法,在此处输入链接描述以验证凭据并生成令牌。

public function login()
{
    $credentials = request(['email', 'password']);

    if (! $token = auth()->attempt($credentials))
        return response()->json(['error' => 'Unauthorized'], 401);

    return $this->respondWithToken($token);
}

我所做的是以下

public function login()
{
    $credentials = request(['email', 'password']);

    if (! Sentinel::authenticate($credentials))
        return response()->json(['error' => 'Unauthorized'], 401);

    $token = auth()->attempt($credentials);
    return $this->respondWithToken($token);
}

但我认为这不是正确的方法,因为有双重身份验证,首先是 Sentinel,第二个是 jwt。这对性能不利。

第二种解决方法是修改位于 vendor/tymon/jwt-auth/src 文件夹中的 JWTGuard 类中的尝试()方法。

默认如下

public function attempt(array $credentials = [], $login = true)
{
    $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

    if ($this->hasValidCredentials($user, $credentials)) {
        return $login ? $this->login($user) : true;
    }

    return false;

}

我像这样改变了它

public function attempt(array $credentials = [], $login = true)
{
    if ($user = Sentinel::authenticate($credentials)) {
        return $this->login($user);
    }

    return false;
}

我现在不知道这是否是一个正确的解决方案?

4

2 回答 2

0

在 jwt 配置中用这个改变

'auth' => Tymon\JWTAuth\Providers\Auth\Sentinel::class,

在身份验证控制器中,您可以使用此功能

use Tymon\JWTAuth\Facades\JWTAuth;

/**
 * Handle a login request to the application.
 *
 * @param loginRequest $request
 *
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 */
public function login(loginRequest $request) {

    $credentials = array(
        'email'    => $request->email,
        'password' => $request->password,
    );

    if (! $token = JWTAuth::attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    } else {
        return $this->respondWithToken($token);
    }
}

/**
 * Get the token array structure.
 *
 * @param  string $token
 *
 * @return \Illuminate\Http\JsonResponse
 */
protected function respondWithToken($token)
{
    return response()->json([
        'access_token' => $token,
        'token_type' => 'bearer',
        'expires_in' => auth('api')->factory()->getTTL() * 60
    ]);
}

现在您可以登录了。

于 2018-07-05T05:11:25.173 回答
0

只是auth('api')->user()用来让用户使用 jwt 或带哨兵的护照

于 2020-12-11T00:18:48.177 回答