it-swarm-pt.tech

Passando chaves da API para descansar a API

Estou trabalhando com Phil esturjão REST_Controller para codeigniter para criar uma API REST, até agora eu consegui criar uma biblioteca simples para gerar chaves de API para os usuários. Meu problema agora é enviar a API chave para a API para cada solicitação, como faço isso sem ter que enviá-lo manualmente para cada solicitação.

28
MrFoh

Você deve analisar a solicitação de assinatura. Um ótimo exemplo é Amazon S3 REST) .

A visão geral é bastante direta. O usuário possui duas informações importantes para usar sua API, um ID de usuário público e uma Chave de API privada. Eles enviam o ID público com a solicitação e usam a chave privada para assinar a solicitação. O servidor de recebimento consulta a chave do usuário e decide se a solicitação assinada é válida. O fluxo é algo como isto:

  1. O usuário ingressa no seu serviço e obtém um ID do usuário (por exemplo, 123) e uma chave de API.
  2. O usuário deseja fazer uma solicitação ao seu serviço de API para atualizar o endereço de e-mail. Portanto, é necessário enviar uma solicitação para sua API, talvez para /user/[email protected].
  3. Para possibilitar a verificação da solicitação, o usuário adiciona o ID do usuário e uma assinatura à chamada, para que a chamada se torne /user/[email protected]&userid=123&sig=some_generated_string
  4. O servidor recebe a chamada, vê que é de userid = 123 e procura a chave da API para esse usuário. Em seguida, replica as etapas para criar a assinatura a partir dos dados e, se a assinatura corresponder, a solicitação será válida.

Essa metodologia garante que a chave da API nunca seja enviada como parte da comunicação .

Dê uma olhada na função hash_hmac () do PHP, que é popular para enviar solicitações assinadas. Geralmente, você faz com que o usuário faça algo como colocar todos os parâmetros em uma matriz, classificar em ordem alfabética, concatenar em uma string e depois hash_hmac essa string para obter o sig. Neste exemplo, você pode fazer:

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

Adicione então $sig no URL REST como mencionado acima.

53
zombat

A idéia de REST é que ela é sem estado - portanto, não há sessões nem nada. Se você quiser se autenticar, é aqui que as chaves entram, e as chaves devem ser passadas para cada solicitação e cada solicitação) autentica o usuário (como REST é sem estado, eu mencionei isso?)).

Existem várias maneiras de passar uma chave. Você pode passá-lo como um parâmetro (por exemplo, http://example.com/api/resource/id?key=api_key ) ou pode passá-lo como parte dos cabeçalhos HTTP. Vi APIs que especificam o envio de seu nome de usuário e uma chave de API como a parte da senha do cabeçalho da autorização de acesso básico HTTP.

Uma solicitação de exemplo:

<?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);

Onde martinbean seria o nome de usuário da minha conta no seu site e 4eefab4111b2a seria minha chave de API.

6
Martin Bean