Подтвердить что ты не робот

Передача ключей api для отдыха api

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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