аутентификация на основе токенов в php - PullRequest
11 голосов
/ 01 марта 2012

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

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

Клиент: Android / Браузер; Сервер: Apache, PHP5

Ответы [ 3 ]

12 голосов
/ 01 марта 2012

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

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

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

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

Authorization: MyScheme 123456:abcde...

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

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

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

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

2 голосов
/ 01 марта 2012

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

На GET: Виден ли отправленный токен?(разве это небезопасно?)

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

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

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

1 голос
/ 13 апреля 2016

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

1) Установите php jwt, выполнив команду composer 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

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