Передача ключей api в rest api
Я работаю с филом Стердженом REST_Controller для codeigniter над созданием api REST, до сих пор мне удавалось создавать простую библиотеку для генерации ключей api для пользователей. Моя проблема теперь заключается в отправке ключа api в API для каждого запроса, как я это делаю, не отправляя его вручную для каждого запроса.
2 answers
Вам следует изучить вопрос о подписании запроса. Отличным примером является API S3 REST от Amazon.
Обзор на самом деле довольно прост. У пользователя есть две важные части информации для использования вашего API: общедоступный идентификатор пользователя и закрытый ключ API. Они отправляют публичный идентификатор вместе с запросом и используют закрытый ключ для подписи запроса. Принимающий сервер ищет ключ пользователя и решает, является ли подписанный запрос действительным. Поток - это что-то вроде это:
- Пользователь присоединяется к вашему сервису и получает идентификатор пользователя (например, 123) и ключ API.
- Пользователь хочет отправить запрос в вашу службу API для обновления своего адреса электронной почты, поэтому ему необходимо отправить запрос в ваш API, возможно, для
/user/[email protected]
. - Чтобы сделать возможным проверку запроса, пользователь добавляет идентификатор пользователя и подпись к вызову, поэтому вызов становится
/user/[email protected]&userid=123&sig=some_generated_string
- Сервер принимает вызов, видит, что он от идентификатора пользователя=123, и ищет Ключ API для этого пользователя. Затем он повторяет шаги по созданию подписи на основе данных, и если подпись совпадает, запрос действителен.
Эта методология гарантирует, что ключ API никогда не будет отправлен как часть сообщения.
Взгляните на функцию PHP hash_hmac(), она популярна для отправки подписанных запросов. Как правило, вы заставляете пользователя делать что-то вроде помещения всех параметров в массив, сортировки по алфавиту, объединения в строку а затем hash_hmac
эта строка, чтобы получить сигнал. В этом примере вы могли бы сделать:
$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)
Затем добавьте это $sig
в URL-адрес 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.