Передача ключей API для остальных API - PullRequest
28 голосов
/ 20 декабря 2011

Я работаю с Phil Sturgeon REST_Controller для codeigniter для создания API REST, поэтому я смог создать простую библиотеку для генерации ключей API для пользователей.Теперь моя проблема - отправка API-ключа в API для каждого запроса. Как это сделать, без необходимости вручную отправлять его для каждого запроса.

Ответы [ 2 ]

53 голосов
/ 20 декабря 2011

Вы должны посмотреть на подписание запроса.Отличным примером является API SEST REST Amazon .

Обзор на самом деле довольно прост.У пользователя есть две важные части информации для использования вашего API, открытый идентификатор пользователя и закрытый ключ API.Они отправляют открытый идентификатор вместе с запросом и используют закрытый ключ для подписания запроса.Принимающий сервер ищет ключ пользователя и решает, является ли подписанный запрос действительным.Процесс выглядит примерно так:

  1. Пользователь присоединяется к вашему сервису и получает идентификатор пользователя (например, 123) и ключ API.
  2. Пользователь хочет сделать запрос к вашему сервису APIчтобы обновить свой адрес электронной почты, чтобы ему нужно было отправить запрос в ваш API, возможно, на /user/update?email=new@example.com.
  3. Чтобы сделать возможным подтверждение запроса, пользователь добавляет идентификатор пользователя и подпись для вызова, поэтому вызов становится /user/update?email=new@example.com&userid=123&sig=some_generated_string
  4. Сервер принимает вызов, видит, что он от userid = 123, и ищет ключ API для этого пользователя.Затем он повторяет шаги для создания подписи из данных, и, если подпись совпадает, запрос действителен.

Эта методология гарантирует, что ключ API никогда не отправляется как часть сообщения..

Посмотрите на PHP-функцию hash_hmac () , она популярна для отправки подписанных запросов.Как правило, вы заставляете пользователя делать что-то вроде помещения всех параметров в массив, сортировки по алфавиту, объединения в строку и затем hash_hmac этой строки для получения сигма.В этом примере вы можете сделать:

$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)

Затем добавить это $sig в URL REST, как упомянуто выше.

6 голосов
/ 20 декабря 2011

Идея 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.

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