Back-End

22 jan, 2015

Autenticação OAuth2 em API com PHP usando Apigility – Parte 02

Publicidade

Na primeira parte, vimos considerações de segurança do OAuth2, configuração do OAuth2no Apigility e aplicativos Web-servidor. Agora, falarei sobre aplicativos baseados no navegador, aplicativos móveis, nome de usuário e senha de acesso e acesso ao aplicativo.

***

Aplicativos baseados em navegador

Esse cenário é muito comum quando você tem um cliente JavaScript (por exemplo, um aplicativo de Página Única) que solicita acesso à API de um servidor de terceiros.

Em um aplicativo baseado em navegador, você não pode armazenar o client_secret de forma segura, o que significa que você não pode usar o fluxo anterior. Precisamos usar um implicit grant. Isso é semelhante ao código de autorização, mas em vez de um código de autorização ser devolvido a partir do pedido de autorização, um token é devolvido.

No diagrama a seguir, informamos os dois passos necessários para a autenticação em cenários de aplicativos baseados em navegador:

oauth2_diagrama

O aplicativo baseado no navegador requisita a página de autorização ao serviço de terceiros (Passo 1). Essa página contém os botões Allow/Deny para autorizar o acesso da API à aplicação. Se o usuário clicar no botão Allow, o servidor de terceiros envia o token de acesso utilizando o identificador de fragmento URI (#access_token na Etapa 2). A utilização do identificador de fragmento para o access_token é importante aqui, do ponto de vista da segurança, uma vez que o sinal não é transmitido para o servidor, o escopo do token é apenas no lado do cliente (do browser).

O cenário de aplicativos baseados em navegador é suportado pelo Apigility usando o tipo implict grant. Esse tipo de concessão é desabilitado por padrão e você precisa ativá-lo manualmente, mudando a configuração de allow_implicit para true no arquivo /config/autoload/local.php:

return array(
    'zf-oauth2' => array(
        // ...
        'allow_implicit' => true,
        // ...
    ),
);

Depois dessa mudança, podemos requisitar um token de acesso usando a aplicação baseada no navegador com 2 passos:

1) Requisite o token de autorização

Precisamos requisitar a mesma URL do passo 1 do cenário de aplicativos Web-servidor (mostrado no artigo anterior):

http:///oauth/authorize?response_type=token
&client_id=testclient&redirect_uri=/oauth/receive

Veremos a mesma página da aplicação Web-servidor perguntando pela autorização da aprovação.

2) Aprove a autorização de acesso

Se aprovarmos o acesso clicando em Yes, o Apigility enviará o token de acesso para a redirect_uri usando o identificador de fragmento URI (#access_token).

Em nosso exemplo, redirecionamos o token de acesso para o /oauth/receive, exibido abaixo:

pic4

Se você clicar no “Click here to read”, verá o token de accesso aparecer na página. Essa ação é realizada por um script JavaScript simples que faz o parser da URL para extrair o valor do access_token. Um exemplo desse código JavaScript:

// function to parse fragment parameters
var parseQueryString = function( queryString ) {
    var params = {}, queries, temp, i, l;
 
    // Split into key/value pairs
    queries = queryString.split("&");
 
    // Convert the array of strings into an object
    for ( i = 0, l = queries.length; i < l; i++ ) {
        temp = queries[i].split('=');
        params[temp[0]] = temp[1];
    }
    return params;
};
 
// get token params from URL fragment
var tokenParams = parseQueryString(window.location.hash.substr(1));

Aplicativos móveis

Esse cenário OAuth2 é semelhante ao anterior para aplicativos baseados em navegador. A única diferença é o redirect_uri, que no mundo móvel pode ser um esquema URI personalizado. Isso permitirá que os aplicativos móveis nativos possam interagir com um aplicativo web de navegador, abrindo uma URL a partir de um aplicativo nativo e voltar para o app com uma URI customizada.

Por exemplo, aplicativos para iPhone podem registrar um protocolo URI personalizado, como “facebook://”. No Android, os aplicativos podem registrar padrões de correspondência de URLs que irão lançar o app nativo se uma URL correspondente ao padrão é visitada.

Abaixo é exibido o esquema para a autenticação OAuth2 com aplicativos móveis:

oauth2_diagrama-2

Como você pode ver no diagrama, é um mecanismo de autenticação de dois passos como para os aplicativos baseados em navegador.

Nome de usuário e senha de acesso

Esse caso de uso pode ser usado para autenticar uma API com acessos concedidos com base no usuário (submetendo o password). O cenário típico inclui uma página de login com nome de usuário e senha usados para autenticar uma API. Acesso com senha só é apropriado para clientes confiáveis. Se você construir seu próprio site como um cliente de sua API, então essa é uma ótima maneira de lidar com login.

O mecanismo de autenticação é muito simples e tem apenas um passo (veja a figura abaixo).

oauth2_diagrama-4

A aplicação cliente envia um POST para o servidor OAuth2 com os valores de usuário e senha. O servidor OAuth2 dá o token de acesso como resposta em formato JSON.

Acesso à aplicação

Esse caso de uso pode ser usado para autenticar o acesso ao aplicativo, mais provável em cenários de máquina para máquina. O tipo de concessão OAuth2 para esse caso de uso é o client_credential. O uso é semelhante ao nome de usuário e senha de acesso relatado acima – o aplicativo envia uma solicitação POST ao servidor OAuth2 passando o client_id, o client_secret, que age como a senha do usuário. O servidor responde com o token se as credenciais do cliente forem válidas.

Atualize o token OAuth2

O protocolo OAuth2 dá a possibilidade de atualizar o token de acesso gerando um novo, com um novo tempo de vida. Essa ação pode ser realizada utilizando o refresh_token que o servidor OAuth2 dá como resposta durante o passo da autenticação.

No Apigility, você pode atualizar o token de acesso com um POST para o terminal do servidor OAuth2. No nosso exemplo de banco de dados OAuth2, podemos realizar um token de atualização usando o seguinte comando:

http -f POST http:///oauth grant_type=refresh_token
refresh_token= client_id=testclient
client_secret=testpass

A resposta será algo semelhante a:

{
    "access_token": "470d9f3c6b0371ff2a88d0c554cbee9cad495e8d",
    "expires_in": 3600,
    "scope": null,
    "token_type": "Bearer"
}

Revogar o token OAuth2

Em agosto de 2013, o IETF publicou a RFC 7009 sobre a revogação de token OAuth2. A versão 0.8 atual do Apigility não suporta a revogação do token, mas vamos suportar esse recurso em breve. De qualquer forma, ainda é possível revogar um token de acesso específico, utilizando o banco de dados PDO. Todos os sinais são armazenados na tabela de oauth_access_tokens, se você quer revogar um token poderá excluí-lo da tabela, com uma consulta SQL assim:

DELETE FROM oauth_access_tokens WHERE access_token = “”;

Conclusão

No Apigility, começamos a oferecer suporte para a autenticação OAuth2 a partir da versão 0.8. Nós ainda estamos trabalhando em algumas das características desse protocolo, como a revogação do token. Estamos coletando feedbacks da comunidade e, se você quer compartilhar seus comentários que são mais do que bem-vindos, junte-se às nossas listas de email apigility-user ou apigility-dev. Mais informações estão disponíveis no site oficial do projeto, apigility.org.

***

Artigo traduzido pela Redação iMasters com autorização do autor. Publicado originalmente em http://www.zimuel.it/oauth2-apigility/