2012-03-01 3 views
10

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

  • В ПОЛУЧЕНИИ: Является ли токен видимым? (разве это небезопасно?)
  • Как сделать токен действительным только в течение определенного времени?
  • ...

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

+0

сделать это как скрытое поле с помощью метода POST –

+6

, что бы смысл службы RESTfull если я мог бы использовать только POST;) я реализовал PUT, POST, GET, DELETE, из Конечно, для каждого метода http существует одна функция –

+0

, чтобы скрыть видимость вашего токена. –

ответ

12

Это можно сделать в любом случае, а значения в запросе 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). Ваш сервер может проверить это, если клиент не должен отправлять токен в виде обычного текста при каждом запросе.

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

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

+0

Спасибо, я думаю, теперь я получил базовую идею. Еще несколько вопросов по этому поводу: 1. Когда клиент получает токен - это будет, например, «простой json-файл», содержащий «TOKEN_A»? 2. Если клиент отправляет хэш, включая метку времени, как проверить на стороне сервера, если хэш действителен? петля над возможными хэшами las X ms? –

+3

1. Да, все, что подходит вашей модели лучше всего. Возможно, пользователь должен зарегистрироваться на веб-сайте и скопировать и вставить токен. Возможно, вы это делаете и через API, и в этом случае ответ JSON в порядке. 2. Заголовок 'Authorization' должен содержать идентификатор пользователя и хэш-код токена. Запрос также должен содержать метку времени, например, в заголовке 'Date', который является довольно стандартным. Хэш будет основан на этом буквальном заголовке «Дата». Ваш сервер просто ищет токен для пользователя, удостоверяет, что дата находится в пределах ± нескольких минут от текущего времени и повторно создает один и тот же хэш. – deceze

+1

Итак, основная идея заключается в следующем: вместо отправки токена, я посылаю вам хэш и информацию A, B, C. Сервер получает токен из UID, хеширует его информацией A, B, C. и проверяет, одинаковы ли хеши ?! - (+ персонал проверки времени) - это довольно умно: D Спасибо большое –

2

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

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

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

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

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

+0

спасибо, я посмотрю на OAuth. Я думаю, что я получил базовую идею сейчас :) –

+0

И POST, и GET эквивалентно небезопасны. Чтобы защитить их, вам нужен еще один криптографический слой, например SSL. –

1

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

1) Установка PHP JWT, выполнив команду композитора композитора требуют 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(); 
      } 

You can get step by step full configurations for php token based authentication

Смежные вопросы