Я не могу подтвердить пользователя с JWT - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь пройти аутентификацию с Jwt. Я нашел много примеров о JWT, но есть место, которое я не понимаю. Я легко могу сгенерировать токены с помощью библиотеки, но не могу проверить, вот библиотека, которую я использую

composer require firebase/php-jwt

Я создаю токен

   // Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
}


require_once('vendor/autoload.php');
use \Firebase\JWT\JWT; 
define('SECRET_KEY','Super-Secret-Key'); 
define('ALGORITHM','HS256');  


$postdata = file_get_contents("php://input");
$request = json_decode($postdata);

$action = $_GET['action'];

логин. php

   if ($action == 'login') {

 $email = 'freaky@jolly.com';
 $password = '12345678';


if($email == "freaky@jolly.com" && $password == "12345678"){

     $iat = time(); // time of token issued at
     $nbf = $iat + 10; //not before in seconds
     $exp = $iat + 60; // expire time of token in seconds

     $token = array(
         "iss" => "http://example.org",
         "aud" => "http://example.com",
         "iat" => $iat,
         "nbf" => $nbf,
         "exp" => $exp,
             "data" => array(
             "id" => 11,
             "email" => $email
         )
     );

    http_response_code(200);

    $jwt = JWT::encode($token, SECRET_KEY);


     $data_insert=array(
         'access_token' => $jwt, 
         'id'   => '007',
         'name' => 'Jolly',
         'time' => time(),
         'username' => 'FreakyJolly', 
         'email' => 'contact@freakyjolly.com', 
         'status' => "success",
         'message' => "Successfully Logged In"
     );


 }else{
     $data_insert=array(
     "data" => "0",
     "status" => "invalid",
     "message" => "Invalid Request"
     ); 
 } 

} else if($action == 'stuff'){

    if (! isset($_SERVER['argv'][1])) {
        exit('Please provide a key to verify');
    }
    $jwt = $_SERVER['argv'][1];

    try {
        $decoded = JWT::decode($jwt, SECRET_KEY, array(ALGORITHM));
        print_r($decoded);

    }catch (Exception $e){

     http_response_code(401);
     $data_insert=array(
     //"data" => $data_from_server,
     "jwt" => $jwt,
     "status" => "error",
     "message" => $e->getMessage()
     );

   } 
}

echo json_encode($data_insert);

Создать токен: http://www.ismailcakir.com/jwt/test2.php?action=login

{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImF1ZCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIiwiaWF0IjoxNTg2NDM4NTg4LCJuYmYiOjE1ODY0Mzg1OTgsImV4cCI6MTU4NjQzODY0OCwiZGF0YSI6eyJpZCI6MTEsImVtYWlsIjoiZnJlYWt5QGpvbGx5LmNvbSJ9fQ.NylRpDkb4cLMxMGAg9ovmLerNf0dLPBHegqmPRDRxlE","id":"007","name":"Jolly","time":1586438588,"username":"FreakyJolly","email":"contact@freakyjolly.com","status":"success","message":"Successfully Logged In"}

Материал: http://www.ismailcakir.com/jwt/test2.php?action=stuff

Здесь я получаю предупреждение что переменная argv не определена, и я не могу вызвать созданный вами токен. После создания токена мне нужно иметь возможность вызывать его без использования cook ie или сеанса. Я перепробовал много методов, но не мог понять, как принимать.

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Используйте следующую инструкцию для проверки того, что вы получаете в качестве аргументов:

<?php
var_dump($argv);
?>

Из официальной документации это доступно, а также: $_SERVER['argv'].

Обратите также внимание, что $argv и $argc должны быть объявлены глобальными при попытке доступа в методе класса.

0 голосов
/ 10 апреля 2020

Чтобы получить токен с помощью:

$ _SERVER ['argv'] [1]

Затем вам нужно запустить скрипт из командной строки (CLI), то есть: php <script_name> argc1 arg2 ..., затем вы сможете получить значения параметров оттуда, если вы используете браузер или вызов API, вам нужно использовать метод HTTP (GET / POST),

или с JSON принимающим вызовом:

file_get_contents("php://input");

Кажется, что вы помещаете все в свой код, ваш код должен быть переформулирован.

Если вы генерируете токен в файловом скрипте, и вы необходимо отправить его обратно на другую страницу, вам нужно использовать запрос GET / POST, если пользователь предоставляет значение и вам нужно сохранить его или использовать его, вам нужно получить его с помощью метода, ниже примера того, как ваш код может работать должным образом (можно предоставить множество способов):

 if ($action == 'login') {

 $email = 'freaky@jolly.com';
 $password = '12345678';


if($email == "freaky@jolly.com" && $password == "12345678"){

     $iat = time(); // time of token issued at
     $nbf = $iat + 10; //not before in seconds
     $exp = $iat + 60; // expire time of token in seconds

     $token = array(
         "iss" => "http://example.org",
         "aud" => "http://example.com",
         "iat" => $iat,
         "nbf" => $nbf,
         "exp" => $exp,
             "data" => array(
             "id" => 11,
             "email" => $email
         )
     );

    http_response_code(200);

    $jwt = JWT::encode($token, SECRET_KEY);

    $_SESSION['token'] = $jwt;
    // $_COOKIE['token'] = $jwt ;
    // GET and POST can be used via a web form or CURL

     $data_insert=array(
         'access_token' => $jwt, 
         'id'   => '007',
         'name' => 'Jolly',
         'time' => time(),
         'username' => 'FreakyJolly', 
         'email' => 'contact@freakyjolly.com', 
         'status' => "success",
         'message' => "Successfully Logged In"
     );


 }else{
     $data_insert=array(
     "data" => "0",
     "status" => "invalid",
     "message" => "Invalid Request"
     ); 
 } 

} else if($action == 'stuff'){

   /*
    * How to receive the generated token
    */
    if (!isset($_SESSION['token']))
    // or (!isset($_POST['token']));
    // or (!isset($_GET['token'])); 
    // or (!isset($_COOKIE['token']));
    {
        exit('Please provide a key to verify');
    }

    $jwt = $_SESSION['token']; 

    // or $jwt = $_GET['token']; 
    // or $jwt = $_POST['token']; 
    // or $jwt = $_COOKIE['token'];

    try {
        $decoded = JWT::decode($jwt, SECRET_KEY, array(ALGORITHM));
        print_r($decoded);

    }catch (Exception $e){

     http_response_code(401);
     $data_insert=array(
     //"data" => $data_from_server,
     "jwt" => $jwt,
     "status" => "error",
     "message" => $e->getMessage()
     );

   } 
}

echo json_encode($data_insert);

Вы можете взглянуть на:

Пример аутентификации REST API в PHP - Учебное пособие по JWT

https://www.codeofaninja.com/2018/09/rest-api-authentication-example-php-jwt-tutorial.html

0 голосов
/ 09 апреля 2020

Согласно документации :

Примечание. Эта переменная недоступна, когда register_argc_argv отключена.

Что наиболее вероятно в вашем случае. Вы можете включить это в конфигурации или, альтернативно, использовать $_SERVER superglobal, который я рекомендую, поскольку он не зависит от различий в конфигурации и всегда работает (включая CLI):

$jwt = $_SERVER['argv'][1];

То же самое для $argc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...