10 de mayo de 2010

Two Legged OAuth - Client - Server sides

I'll write this post in English so it can be read by many other, as English is the common language in IT.

For a project I'm working in we needed to find a way to communicate an application with another application API in PHP. After reserching a while we found OAuth and its implementation in PHP.

More difficult was to find examples and implementations of the Two-Legged OAuth with both client and server side examples, which is what I'll gather toghether here. This implementation is intended to be the basics for a REST PHP server.

Most information has been taken from this two post: here and here




What we need is PHP 5 and the OAuth lib for PHP(here).

We will use several files so we can schematize an application traying to communicate with the server using OAuth for security through an unsecure channel (http, for example).
For these examples all files must be in the same folder at the same level.
Our first file is a simple html form for sending a value:



As you can see, we are sending the form to recibir.php. Apart from a normal POST you can achieve this using AJAX to avoid page reload.

Now, recibir.php:



Great. Now we have the entrance point and the file recieving the information from the entrance point and signing with OAuth.

Now, server.php will check with OAuth for key integrity and if true, will make another curl call to the API (api.php) and then return the result.



So now we just need the api.php to do some stuf. Here I divided the api.php in two different files. One for the logic and another one for the html. In this example ther is no logic, just html. So:

api.php


And api_view.php:




Hope this will help you in implementing OAuth in your application.

Any constructive critic to improve this example is wellcome.



5 comentarios:

Juanpa dijo...

Hola, muchas gracias por el ejemplo
Recién he empezado a implementar oauth en un API para manejar la autorización. Pero quería consultar si era posible que no solo exista un solo par de claves sino varias y que se encuentren registrados en la base de datos.
Lo que permita a cada consumer otorgarle las claves de acceso y que puedan trabajar con el API.
Saludos

Mr. Ed dijo...

Hola Juanpa, me alegro que te haya ayudado.

Respecto a lo que preguntás, si se puede. Tendrías que de alguna forma identificar quien está pidiendo acceso, para saber que par de claves utilizar. Tal vez con un parámetro en la url.

JUSTITIA dijo...

Hola,
una pregunta, ¿cual es la diferencia entre secret y key?, porque viendo el ejemplo supongo que ambos datos deben ser iguales tanto en server.php como en recibir.php, entonces cuando modifico en alguno de los dos el secret sale el mensaje invalid sig pero cuando modifico el key la conexion funciona.
Y yo pensaba que los dos deberían ser iguales para establecer la autorización.
Espero que me puedan ayudar ya que no conozco mucho de oauth
Muchas gracias

Mr. Ed dijo...

Hola Justitia.

La diferencia es que secret es secreta, valga la redundancia.
Si te fijas, key viaja en la url indicando parte de la llave utilizada para codificar. Al venir en la url, OAuth utiliza el key de la url, junto con la secret que tienes igual en ambos. Al comprobarlo, tiene las dos partes correctas y por eso te funciona.

JUSTITIA dijo...

Muchas gracias Ed por responder,
Si había visto que el key se coloca en la url, solo que me confunde el propósito que tiene key y secret...
Según veo entonces secret es el q valida si tenemos la autorización correcta y key permite descifrar los datos q llegan al consumer para saber q los datos lleguen al mismo q los solicitó y por lo tanto solo el key sería necesario en el archivo recibir y mas no en server.php
Espero q este bien como pienso , espero tus comentarios y muchas gracias por todo