Передача ключей api в REST api

Я работаю с phil sturgeon REST_Controller для codeigniter для создания REST api, до сих пор мне удалось создать простую библиотеку для генерации ключей api для пользователей. Моя проблема теперь отправляет ключ api в API для каждого запроса, как я это делаю без необходимости вручную отправлять его для каждого запроса.

2 ответов


вы должны изучить подписание запроса. Отличный пример API S3 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. В этом примере вы можете сделать:

$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.