【发布时间】:2018-12-13 07:39:13
【问题描述】:
我有一个生成 JWT 的函数:
function getToken($user, $expTime){
$jwt = \Firebase\JWT\JWT::encode([
'iss' => request()->getBaseUrl(),
'sub' => "{$user['id']}",
'exp' => $expTime,
'iat' => time(),
'nbf' => time(),
'is_admin' => $user['role_id'] == 1
], getenv("SECRET_KEY"), 'HS256');
return $jwt;
}
此函数返回以下标记:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJcL2FwaSIsInN1YiI6InVzNWIzY2M4YmRlMDc4MSIsImV4cCI6NTUxMDY1ODkyNDAwMCwiaWF0IjoxNTMwNzM4NTkwLCJuYmYiOjE1MzA3Mzg1OTAsImlzX2FkbWluIjpmYWxzZX0.3bMaxCaMprURZEDurnckZWSoDRp7ePMxZXDW0B6q6fk P>
当我使用这个令牌发出请求时,我得到了:
{
"status": "error",
"message": "Signature verification failed"
}
为了让它工作,我去https://jwt.io/,添加密钥并通过传递秘密来验证它。
然后我得到这个令牌:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIvYXBpIiwic3ViIjoidXM1YjNjYzhiZGUwNzgxIiwiZXhwIjo1NTEwNjU4OTI0MDAwLCJpYXQiOjE1MzA3Mzg1OTAsIm5iZiI6MTUzMDczODU5MCwiaXNfYWRtaW4iOmZhbHNlfQ.heF_L9LrFp7Hht2dbVtOMx_gdUtmPKzrMgxW1_jdWLo P>
这很好用。但是如何使用 php 代码验证它,以便我可以将其发送给用户?
响应代码:
function loginUser($email, $password) {
try {
// Connecting to databas
$db = new db();
$db = $db->connect();
$user = findUserByEmail($email, $db);
if(empty($user)){
echo 'User not found';
exit;
}
if(!password_verify($password, $user['password'])) {
echo 'Password does not match';
exit;
}
$expTime = time() * 3600;
$jwt = getToken($user, $expTime);
// Close databse
$db = null;
} catch(PDOException $e){
echo $e->getMessage();
}
return $jwt;
}
【问题讨论】:
-
发送此响应的代码在哪里?
-
我更新了帖子,所以你可以看到代码。
-
好的,但是,谁发送这个消息:
"message": "Signature verification failed"? -
对不起,我忘了提。我将这个框架github.com/tuupola/slim-jwt-auth 用于身份验证系统。但我觉得没关系。思考的是如何验证密钥。
-
此消息是在发出请求且令牌错误时从框架发送的。