Передача ключей api в REST api
Я работаю с phil sturgeon REST_Controller для codeigniter для создания REST api, до сих пор мне удалось создать простую библиотеку для генерации ключей api для пользователей. Моя проблема теперь отправляет ключ api в API для каждого запроса, как я это делаю без необходимости вручную отправлять его для каждого запроса.
2 ответов
вы должны изучить подписание запроса. Отличный пример API S3 REST от Amazon.
обзор довольно проста. У пользователя есть две важные части информации для использования API: открытый идентификатор пользователя и закрытый ключ API. Они отправляют открытый идентификатор с запросом и используют закрытый ключ для подписи запроса. Принимающий сервер ищет ключ пользователя и решает, является ли подписанный запрос допустимым. Поток-это что-то вроде это:
- пользователь присоединяется к вашей службе и получает идентификатор пользователя (например, 123) и API ключ.
- пользователь хочет сделать запрос на ваш сервис API, чтобы обновить свой адрес электронной почты, поэтому им нужно отправить запрос на ваш API, возможно, чтобы
/user/update?email=new@example.com
. - для того, чтобы можно было проверить запрос, пользователь добавляет идентификатор пользователя и подпись для вызова, поэтому вызов становится
/user/update?email=new@example.com&userid=123&sig=some_generated_string
- сервер принимает вызов, видит, что это из userid=123 и ищет ключ API для этого пользователя. Затем он реплицирует шаги для создания подписи из данных, и если подпись совпадает, запрос действителен.
эта методология обеспечивает ключ API никогда не отправляется как часть сообщения.
взгляните на PHP hash_hmac () функция, она популярна для отправки подписанных запросов. Как правило, вы заставляете пользователя делать что-то вроде параметры в массив, сортировка по алфавиту, объединение в строку, а затем hash_hmac
эта строка, чтобы получить sig. В этом примере вы можете сделать:
$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)
добавьте $sig
на остальной url, как упоминалось выше.
идея отдыха заключается в том, что он без гражданства-так что никаких сеансов или что-то еще. Если вы хотите аутентифицироваться, то здесь входят ключи, и ключи должны быть переданы для каждого запроса, и каждый запрос аутентифицирует пользователя (поскольку REST является апатридом, я упоминал об этом?).
существуют различные способы передачи ключа. Вы можете передать его как параметр (т. е.http://example.com/api/resource/id?key=api_key) или вы можете передать его как часть заголовков HTTP. Я видел APIs, который Укажите имя пользователя и ключ API в качестве части пароля заголовка авторизации http basic access.
пример запроса:
<?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.