Signed requests com Opensocial, PHP e OAuth

Após ver várias pessoas com dúvidas sobre o assunto, resolvi escrever um pouco como implementar requests assinados, ou seja, signed requests utilizando Opensocial, OAuth e Orkut como container.

Para deixar claro o que é o signed request, vamos usar um exemplo bem básico:

  • Você possui um aplicativo Opensocial rodando no Orkut que envia requisições HTTP para seu servidor;
  • O seu servidor trata a requisição e salva alguns dados no banco de dados;
  • Algum momento depois, o seu aplicativo requisita os dados e sua aplicação codifica e transmite de volta;
  • Você quer garantir que somente o Orkut envie requisições HTTP ( get ou post), garantindo que ninguém manipule os dados, usando um formulário de mentira ou até modificando os parâmetros via Firebug, por exemplo;

O último tópico é a chave de tudo. Pois bem, como garantir essa segurança ? Pensando nesse problema, os containers implementaram um modelo baseado no OAuth. Se você nunca ouviu falar de OAuth, sugiro que vá até o site e dê uma olhada – http://www.oauth.net.

De uma visão bem macro, o container (Orkut, Hi5, MySpace, etc), criptografa os dados, transmite alguns parâmetros através do cabeçalho HTTP e o servidor final, deve ser capaz de decriptografar a mensagem e receber o request. Caso isso não aconteça, o request não é válido e a mensagem não chega ao destino.

Gostaria de deixar claro que isso não é SSL (secure socket layer). É apenas um protocolo para ser usado sob HTTP para melhorar a segurança. Utiliza alguns dos mecanismos de criptografia do SSL, mas não da mesma forma.

Continuando…

Se você, da mesma forma que eu, gosta de um pouco de teoria, sugiro acessar o site do OAuth e entender um pouco mais como funciona. Muita gente prefere ir direto ao código, portanto vou procurar ser um pouco objetivo aqui.

Para implementar requests assinados no Orkut, primeiramente você precisa baixar a chave pública disponibilizada por eles mesmos. Dessa forma garantimos que conseguimos decriptar a mensagem enviada pelo servidor. Você pode baixar por aqui .

Caso queira a lista completa de todos os certificados, use esse blog do Opensocial Resources que a fonte é confiável. https://opensocialresources.appspot.com/certificates/

Depois disso, basta implementar uma receita de bolo. Praticamente todas as linguagens oferecem suporte ao OAuth e eu já implementei tranquilamente usando PHP, .NET e Java. Especificamente para PHP tenho código fonte pronto que vou disponibilizar aqui. Não é nada muito sofisticado, mas dá pra você implementar algo por cima.

1- Implementando um request simples pelo Opensocial. Estou supondo que você saiba como é criar o app.xml e como chamar pelo menos a função init:

function criaSignedRequest()
{

var postdata = {acao: “retornaJson”}; // post campo chamado acao
postdata = gadgets.io.encodeValues(postdata);

var params = {};
// linha abaixo determina que o request é do tipo SIGNED.
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
params[gadgets.io.RequestParameters.POST_DATA]= postdata;

// envia o request
gadgets.io.makeRequest(‘http://www.meusite.com/acao.php’, onCallback,params);
}

function onCallback(ret)
{
//retorna um json convertido para array
var retorno = gadgets.json.parse(gadgets.util.unescapeString(ret.data));

if(retorno!=null)
{
alert(retorno['mensagem']); // deve imprimir Ola mundo
}

}

2 – Implementando do lado do PHP

Não vou entrar nos detalhes da implementação do OAuth. Simplesmente baixei uma API pronta, disponibilizada pela própria Google e realizei as alterações necessárias para meu código funcionar.

Mais detalhes do projeto OAuth em PHP você pode ver aqui: http://code.google.com/p/oauth/

<?php
require_once(“verifica_certificado.php”);

// verifica se o certificado veio correto.
if($payload["auth"]==”OK”)
{
$acao = $_POST["acao"]; // recebe o post chamado acao definido no javascript

if($acao==”retornaJson”)
{
$retorno = Array();
$retorno["mensagem"]=”Ola mundo”;

// essa funcao faz a magica de converter um array php em um json que irá virar código javascript
echo json_encode($retorno);

}
}

?>

Nota: $payload["auth"] é o retorno que está em verifica_certificado.php . Dê uma avaliada no código, que por sinal é bem simples. Brinque também com o Firebug para ver os requests sendo enviados e o retorno do mesmo.

Baixe os códigos necessários para fazer a aplicação rodar (verifica_certificado.php, disable_magic_quotes.php, CertFileAccessor.php, OAuth.php).

Espero ter clareado um pouco e mostrar como é simples. Além disso, não deixe de visitar a wiki do Opensocial sobre Signed Requests que está bem detalhada e possui exemplo em Java. http://wiki.opensocial.org/index.php?title=Validating_Signed_Requests

Tem dúvida ? Poste aqui no Blog.

-Robson Dantas, PMP, Opensocial Guru

Bookmarksbookmark bookmark bookmark bookmark bookmark bookmark

Popularity: 5%

15 Comments so far

  1. Rúbia Gardini on December 8th, 2008

    Olá Robson, gostei do artigo. Ainda estou enrolada com a implementação do OAuth no site, embora q agora, por causa desse link http://code.google.com/apis/accounts/docs/OAuth.html#WorkingOAuth, as idéias estão clareando um pouco.

    Acho que não peguei a idéia básica da coisa e ainda não entendo o passo-a-passo do processo. Por isso que estou tão perdida.

  2. Sidney Zanetti on January 20th, 2009

    Legal o post.

    Mas ficou faltando o link para baixar o verifica_certificado.php.

    abraços

  3. admin on January 23rd, 2009

    Link adicionado :)

  4. John on February 1st, 2009

    Boas informações , mas ainda nao entendo mtu bem, baixei os arquivos, mas nao consegui fazer funcionar, da um erro;
    Warning: fopen(./oauth_cert_files/orkut/) [function.fopen]: failed to open stream: No such file or directory in /

    se puder dar uma luz ai
    valew

  5. admin on February 1st, 2009

    Tá faltando o certificado do orkut. Baixa ele no caminho que eu te passei e joga nessa pasta.

    abs

  6. John on February 2nd, 2009

    :) Valew Dantas, agora funciono certinho hehe,
    e caso eu queira adicionar uma app no Myspace,
    poderia fazer assim por exemplo;

    var postdata=acao:’r_json’,network:’okt_ou_MS’};

    e no verifica_certificado.php colocar;

    $cert_accessor = new CertFileAccessor(‘cer’, ‘$_POST[network]‘);

    e colocar na pasta identificada pela variavel o certificado do Myspace?

    Grato

  7. Lucas on May 26th, 2009

    Tá bem explicadinho, só que eu não entendo uma coisa:
    Onde é exatamente pra se colocar o certificado? Devo criar o caminho: “oauth_cert_files/orkut/” na mesma pasta que está hospedado o “verifica_certificado.php” e colocar o certificado dentro?
    Além disso o arquivo “disable_magic_quotes.php” não vem no pack

    Grato

  8. Lucas on May 29th, 2009

    Já consegui resolver a parte dele achar o certificado, agora ele dá erro na parte da verificação de autorização do mesmo método.
    Você sabe o que poderia ser?

    Grato

  9. Maria Amélia on September 24th, 2009

    Estou súvidas.. antes de implementar o código, é necessário registar o seu domínio no google, p/ que seja gerado a secret key?

  10. admin on September 27th, 2009

    Registrar domínio no Google ?

    Vc precisa ter um site com ip na internet para poder fazer as requisições seguras.

  11. Leonardo on October 28th, 2009

    Será que tu poderia dospinibilizar um exemplo completo para download inslusive com o app.xml ?

    Obrigado.

  12. admin on October 31st, 2009
  13. Leonardo on October 31st, 2009

    OK, muito obrigado pela atenção.

  14. Robson on October 31st, 2009

    Leonardo,

    Postei um exemplo agora em http://www.opensocial-br.org

    abs

  15. Leonardo on November 1st, 2009

    Novamente, muito obrigado, é o post do dia 31 certo ?

Vale Presente