аутентификация на основе токенов в php

У меня есть служба REST на моем веб-сервере, написанная на php. Мне было интересно, какая будет лучшая аутентификация (помимо базовой аутентификации http-доступа). Я слышал об аутентификации на основе токенов и хотел бы спросить, Может ли кто-нибудь объяснить основные шаги.

  • на GET: виден ли токен send? (разве это не опасно?)
  • как сделать токен действительным только в течение определенного времени?
  • ...

Клиент: Android / Браузер; Сервер: Апач, php5 с

3 ответов


это можно сделать в любом случае, и значения в запросе GET на самом деле не более заметны, чем значения в запросе POST. Если кто-нибудь может "видеть" (т. е. Конст) запрос, он может видеть все, что вы отправляете. В конце концов HTTP-запрос-это просто куча HTTP-заголовков, за которыми может следовать тело. URL-адрес отправляется в первом GET /foo/bar HTTP/1.1 line, другие значения просто отправляют в разные, следующие строки.

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

GET /foo/bar?user=123456&token=abcde...

чтобы действительно использовать протокол HTTP по назначению, вы должны использовать Authorization заголовок HTTP:

Authorization: MyScheme 123456:abcde...

содержание этого заголовка полностью зависит от вас. Обычно он указывает метод авторизации, например Basic, а затем все, что вы хотите потребовать для аутентификации. Это может быть просто имя пользователя и пароль, их хэш, непрозрачный токен клиент получил в какой-то момент или что-то еще на самом деле.

Я бы рекомендовал систему токенов или систему подписи запросов, причем последняя очень предпочтительна. В системе подписи запросов клиент должен получить от вас маркер. Затем он отправляет хэш этого токена и определенные характеристики запроса для аутентификации запроса, например sha1(Token + Timestamp + Request URL + Request Body). Ваш сервер может проверить это без необходимости отправки клиентом маркера в виде обычного текста по каждому запросу.

как сделать токен действительным только в течение определенного времени?

вы сохраняете серверную сторону токена с меткой времени истечения срока действия и проверяете ее.


здесь вопрос о аутентификации на основе токенов. Я думаю, что наиболее распространенной аутентификацией на основе токенов сегодня является OAuth. Но чтобы ответить на ваши вопросы:

на GET: виден ли токен send? (разве это не опасно?)

вы можете передавать свои токены через HTTP-заголовки, чтобы их было не так легко увидеть. Протокол OAuth позволяет. Обратите внимание, что токены все еще видны, они просто не в GET запрос параметры.

Как сделать токен действительным только в течение определенного времени?

поскольку вы управляете (создаете) токены, вы можете установить даты истечения срока действия для каждого токена. По каждому запросу вашего API вы должны просто проверить свое хранилище токенов (например, базу данных), если данный токен все еще действителен. Если это не так, то вы можете прервать запрос (возможно, вернуть ошибку HTTP 401).


вы можете использовать fire-base php JWT (JSON Web Token) для аутентификации на основе токенов.

1) Установите php jwt, выполнив команду composerкомпозитор требует firebase / php-jwt

   require_once('vendor/autoload.php');
   use \Firebase\JWT\JWT; 
   define('SECRET_KEY','Your-Secret-Key')  // secret key can be a random string  and keep in secret from anyone
   define('ALGORITHM','HS512')

после этого создайте свой токен

$tokenId    = base64_encode(mcrypt_create_iv(32));
                $issuedAt   = time();
                $notBefore  = $issuedAt + 10;  //Adding 10 seconds
                $expire     = $notBefore + 7200; // Adding 60 seconds
                $serverName = 'http://localhost/php-json/'; /// set your domain name 


                /*
                 * Create the token as an array
                 */
                $data = [
                    'iat'  => $issuedAt,         // Issued at: time when the token was generated
                    'jti'  => $tokenId,          // Json Token Id: an unique identifier for the token
                    'iss'  => $serverName,       // Issuer
                    'nbf'  => $notBefore,        // Not before
                    'exp'  => $expire,           // Expire
                    'data' => [                  // Data related to the logged user you can set your required data
                'id'   => "set your current logged user-id", // id from the users table
                 'name' => "logged user name", //  name
                              ]
                ];
              $secretKey = base64_decode(SECRET_KEY);
              /// Here we will transform this array into JWT:
              $jwt = JWT::encode(
                        $data, //Data to be encoded in the JWT
                        $secretKey, // The signing key
                         ALGORITHM 
                       ); 
             $unencodedArray = ['jwt' => $jwt];

предоставьте этот токен вашему пользователю"$JWT в" . По каждому запросу пользователю необходимо отправить значение токена с каждым запросом для проверки пользователя.

 try {
           $secretKey = base64_decode(SECRET_KEY); 
           $DecodedDataArray = JWT::decode($_REQUEST['tokVal'], $secretKey, array(ALGORITHM));

           echo  "{'status' : 'success' ,'data':".json_encode($DecodedDataArray)." }";die();

           } catch (Exception $e) {
            echo "{'status' : 'fail' ,'msg':'Unauthorized'}";die();
           }

вы можете сделать шаг за шагом конфигурации для аутентификации на основе токенов php