JWT decode () должен иметь тип ошибки типа - PullRequest
1 голос
/ 26 марта 2019

Здесь у меня есть тонкий PHP-код, который входит в систему, и функция, чтобы проверить, декодирует ли он JWT, который хранится в заголовке.

$app->post('/login', function ($request, $response) {

$input = $request->getParsedBody();
$settings = $this->get('settings'); // get settings array.
$sql = "SELECT id, password FROM users WHERE id= :id";
$sth = $this->db->prepare($sql);
$sth->bindParam("id", $input['id']);
$sth->execute();
$user = $sth->fetchObject();

// verify user id 
if(!$user) {
    return $this->response->withJson(['error' => true, 'message' => 'NO ID '], 404)->withHeader('Content-type', 'application/json;charset=utf-8', 404);
}
// Compare the input password and the password from database for a validation
if (strcmp($input['password'],$user->password)) {
    return $this->response->withJson(['error' => true, 'message' => 'These credentials do not match our records.'], 404)->withHeader('Content-type', 'application/json;charset=utf-8', 404);  
}

$payload = array(
    "iat" => time(),
    "exp" => time() + 36000,
    // "id" => $input['id']
    "context" => [
        "user" => [
            "id" => $input['id']
        ]
    ]
);

try {
    $token = JWT::encode($payload, $settings['jwt']['secret'],"HS256"); // $token store the token of the user
} catch (Exception $e) {
    echo json_encode($e);
}


return $this->response->withJson($payload,200)
                      ->withHeader('Content-type', 'application/json;charset=utf-8', 200)
                      ->withAddedHeader('Authorization', $token);
});


$app->get('/get', function ($request, $response) {

$jwt = $request->getHeader("Authorization"); 
$settings = $this->get('settings'); 

$token = JWT::decode($jwt, $settings['jwt']['secret'], "HS256"); // $token store the token of the user

if ($token) {
    return $this->response->withJson($token, 200)
    ->withHeader('Content-type', 'application/json;charset=utf-8', 200);
}

return $this->response->withJson($token,401)
                      ->withHeader('Content-type', 'application/json;charset=utf-8', 401);

});

Но когда я пытаюсь запустить http://localhost:8080/get, возвращается ошибка, которая

Аргумент 3, передаваемый в Firebase \ JWT \ JWT :: decode (), должен иметь тип массива.

Почему это происходит и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Если я декодирую в той же функции, он возвращает декодированный JWT, но если я декодирую в другой функции, он возвращает ошибку. Как передать jwt другой функции?

$app->post('/login', function ($request, $response) {

$key = "supersecretkeyyoushouldnotcommittogithub";

$input = $request->getParsedBody();
$settings = $this->get('settings'); // get settings array.
$sql = "SELECT id, password FROM users WHERE id= :id";
$sth = $this->db->prepare($sql);
$sth->bindParam("id", $input['id']);
$sth->execute();
$user = $sth->fetchObject();

// verify user id 
if(!$user) {
    return $this->response->withJson(['error' => true, 'message' => 'NO ID '], 404)->withHeader('Content-type', 'application/json;charset=utf-8', 404);
}
// Compare the input password and the password from database for a validation
if (strcmp($input['password'],$user->password)) {
    return $this->response->withJson(['error' => true, 'message' => 'These credentials do not match our records.'], 404)->withHeader('Content-type', 'application/json;charset=utf-8', 404);  
}

$payload = array(
    "iat" => time(),
    "exp" => time() + 36000,
    // "id" => $input['id']
    "context" => [
        "user" => [
            "id" => $input['id']
        ]
    ]
);

try {
    $token = JWT::encode($payload, $key); // $token store the token of the user
} catch (Exception $e) {
    echo json_encode($e);
}

// return $this->response->withJson($payload,200)
//                       ->withHeader('Content-type', 'application/json;charset=utf-8', 200)
//                       ->withHeader('Authorization', $token);

$decoded = JWT::decode($token, $key, array('HS256'));

print_r($decoded);


});
0 голосов
/ 26 марта 2019

Попробуйте следовать тому, что говорит ошибка:

$token = JWT::decode($jwt, $settings['jwt']['secret'], ["HS256"]);

Пример использования вы можете увидеть здесь

...