Я работаю с phil sturgeon REST_Controller для codeigniter для создания REST api, до сих пор мне удалось создать простую библиотеку для генерации ключей api для пользователей. Моя проблема теперь отправляет ключ api в API для каждого запроса, как я делаю это без необходимости вручную отправлять его для каждого запроса.
Вы должны заглянуть в подписание запроса. Отличным примером является API SAS REST от Amazon .
Обзор на самом деле довольно простой. У пользователя есть две важные части информации для использования вашего API, открытого идентификатора пользователя и частного ключа API. Они отправляют публичный идентификатор с запросом и используют закрытый ключ для подписи запроса. Принимающий сервер просматривает ключ пользователя и решает, действителен ли подписанный запрос. Поток выглядит примерно так:
/user/update?email=new@example.com
. /user/update?email=new@example.com&userid=123&sig=some_generated_string
Эта методология гарантирует, что ключ API никогда не будет отправлен как часть сообщения .
Взгляните на функцию hash_hmac () PHP, она популярна для отправки подписанных запросов. Как правило, вы получаете от пользователя что-то вроде поместить все параметры в массив, отсортировать по алфавиту, hash_hmac
в строку и затем hash_hmac
эту строку, чтобы получить сиг. В этом примере вы можете:
$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)
Затем добавьте этот $sig
на URL REST, как указано выше.
Идея REST заключается в том, что она без гражданства, поэтому никаких сеансов и ничего. Если вы хотите выполнить аутентификацию, тогда это ключи, в которые входят ключи, и ключи должны передаваться для каждого запроса, и каждый запрос аутентифицирует пользователя (поскольку REST является апатридом, я упоминал об этом?).
Существуют различные способы передачи ключа. Вы можете передать его как параметр (например, http://example.com/api/resource/id?key=api_key ), или вы можете передать его как часть заголовков HTTP. Я видел API, которые указывают, что вы отправляете свое имя пользователя и ключ API в качестве части пароля заголовка авторизации основного доступа HTTP.
Пример запроса:
<?php $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => 'http://example.com/api/resource/id', CURLOPT_USERPWD => 'martinbean:4eefab4111b2a' )); $response = curl_exec($ch);
Где martinbean
будет моим именем пользователя на вашем сайте, а 4eefab4111b2a
будет моим ключом API.