尝试通过使用tymon / jwt-auth(JWT)在laravel安装中实现登录端点。登录,注销,获取用户数据工作正常。我想要一个用于检查Bearer令牌的端点。有一个简短的方法可以通过以下方式实现此目的:
Route::get('/valid', function () {
return 1;
})->middleware('auth:api');
如果令牌有效,则HTTP返回代码== 200,但如果无效,则返回401代码。由于端点正在检查令牌,而不是经过身份验证的通信,因此,我希望控制器以200-OK返回有关有效令牌的true / false。
我看了模块的“内幕”,那是我能走多远(不工作):
$tokenKey = $request->bearerToken();
$jws = \Namshi\JOSE\JWS::load($tokenKey);
$jwsSimple = new SimpleJWS($jws->getHeader());
$jwsSimple::load($tokenKey);
$jwsSimple->setPayload($jws->getPayload());
$jwsSimple->setEncodedSignature(explode('.', $tokenKey)[2]);
$tmpVal = $jwsSimple->isValid($tokenKey);
有没有更好的方法来实现这一目标?我认为应该为此提供服务提供商,但无法弄清楚如何实施。预先谢谢你。
答案 0 :(得分:4)
您可以删除auth:api
中间件,然后添加类似以下内容的文件:
return response()->json([ 'valid' => auth()->check() ]);
答案 1 :(得分:1)
也许此方法需要您:
public function getAuthenticatedUser()
{
try {
if (! $user = JWTAuth::parseToken()->authenticate()) {
return response()->json(['user_not_found'], 404);
}
} catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
return response()->json(['token_expired'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
return response()->json(['token_invalid'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
return response()->json(['token_absent'], $e->getStatusCode());
}
return response()->json(compact('user'));
}
答案 2 :(得分:0)
以下是混合输出,可使用laravel和tymon / jwt-auth实现基于状态的令牌验证:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ValidTokenController extends Controller
{
public function __invoke(Request $request)
{
$response = (int) auth('api')->check();
$responseCode = 200;
try {
if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate()) {
$response = 0;
}
} catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
$response = -1;
} catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
$response = -2;
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
$response = -3;
}
return response()->json($response, $responseCode);
}
}