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


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

Author: hippietrail, 2011-12-20

2 answers

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

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

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

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

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

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

Затем добавьте это $sig в URL-адрес REST, как указано выше.

 53
Author: zombat, 2011-12-19 21:39:16

Идея ОТДЫХА заключается в том, что он не имеет состояния - так что никаких сеансов или чего-то еще. Если вы хотите пройти аутентификацию, то именно здесь вводятся ключи, и ключи должны передаваться для каждого запроса, и каждый запрос аутентифицирует пользователя (поскольку 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.

 6
Author: Martin Bean, 2011-12-19 21:24:25