Ejemplo de OAuth en KumbiaPHP

De KumbiaPHP Framework Wiki
Revisión del 22:17 8 jun 2010 de Soukron (discusión | contribuciones) (Página creada con ''''Nota previa''' Este ejemplo esta sacado de la documentacion de [http://twitter.com Twitter] / [http://github.com/abraham/twitteroauth/ TwitterOAuth] y adaptado a un controlad...')
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)

Nota previa Este ejemplo esta sacado de la documentacion de Twitter / TwitterOAuth y adaptado a un controlador/vista de KumbiaPHP de forma básica. Es un punto de partida para muchos ya que he visto bastante gente pegandose con OAuth en el IRc y preguntando.


  • Descargar la libreria TwitterOAuth, descomprimela y copia los ficheros OAuth.php y TwitterOAuth.php en /app/libs de tu arbol de directorios de KumbiaPHP.



  • Registra también tu aplicación, indicando que el tipo de aplicación es via Navegador (Browser), indica el tipo de permiso que necesitas (ReadOnly o ReadWrite), y marca el checkbox final, para indicar que usaremos Twitter para hacer inicios de sesión.


  • Ahora creamos un controlador, usando el codigo de la documentación de TwitterOAuth como base:

app/controllers/oauth/oauth_controller.php

<?php
Load::lib("TwitterOAuth");
class OAuthController extends ApplicationController 
{
	protected $consumerKey;
	protected $consumerSecret;
	protected $callBack;

	public function initialize() {
                /* Esto es mio, ya que tengo los valores en la base de datos, lo dejo para servir de ejemplo
		$rows = $this->Configuration->find("name LIKE '%oauth%' ORDER BY name ASC");
		$this->callBack 	= $rows[0]->value;
		$this->consumerKey 	= $rows[1]->value;
		$this->consumerSecret	= $rows[2]->value;
                */
                $this->callBack 	= "http://<tudominio>/oauth/_callback";
		$this->consumerKey 	= "<aqui tu Consumer Key>";
		$this->consumerSecret	= "<aqui tu Consumer Secret>";
	}
		
	public function index() 
	{
		session_start();
		if (empty($_SESSION['access_token']) || empty($_SESSION['access_token']['oauth_token']) || empty($_SESSION['access_token']['oauth_token_secret'])) 
		{
			$this->render(NULL);
			$this->redirect("oauth/_register");
		}

		/* Get user access tokens out of the session. */
		$access_token = $_SESSION['access_token'];

		/* If access tokens are not available redirect to connect page. */
		if (empty($access_token['oauth_token']) || empty($access_token['oauth_token_secret'])) {
			header('Location: http://twitbot.gmbros.net/oauth/_register/');
		}

		/* Create a TwitterOauth object with consumer/user tokens. */
		$connection = new TwitterOAuth($this->consumerKey, $this->consumerSecret, $access_token['oauth_token'], $access_token['oauth_token_secret']);

		/* Get credentials to test API access */
		$credentials = $connection->get('account/verify_credentials');
 
		if ($credentials->error) {
			$this->msg = $credentials->error."<br><br><a href='http://twitbot.gmbros.net/oauth/_register'>Register now</a>";
		}
		else {
			$this->msg = "Acceso confirmado, OAuth correcto. Bienvenido ".$credentials->screen_name.".<br><br><a href='http://twitbot.gmbros.net/oauth/_logout'>Logout</a>";
		}
	}

	public function _redirect() 
	{
		session_start();

		/* Create TwitterOAuth object and get request token */
		$connection = new TwitterOAuth($this->consumerKey, $this->consumerSecret);

		/* Get request token */
		$request_token = $connection->getRequestToken($this->callBack);

		/* Save request token to session */
		$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
		$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
		 
		/* If last connection fails don't display authorization link */
		switch ($connection->http_code) {
			case 200:
				/* Build authorize URL */
				$url = $connection->getAuthorizeURL($token);
				header('Location: ' . $url);
				break;
			default:
				echo 'Could not connect to Twitter. Refresh the page or try again later.';
		}
		die();
	}

	public function _register() {
		session_start();
		session_destroy();
	}

	public function _logout() {
		session_start();
		session_destroy();
		$this->render(NULL);
		$this->redirect("oauth/index");
	}

	public function _callback() 
	{
		session_start();

		/* If the oauth_token is old redirect to the connect page. */
		if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] !== $_REQUEST['oauth_token']) {
			$_SESSION['oauth_status'] = 'oldtoken';
			header('Location: http://<tudominio>/oauth/_register/');
		}

		/* Create TwitteroAuth object with app key/secret and token key/secret from default phase */
		$connection = new TwitterOAuth($this->consumerKey, $this->consumerSecret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

		/* Request access tokens from twitter */
		$access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);

		/* Save the access tokens. Normally these would be saved in a database for future use. */
		$_SESSION['access_token'] = $access_token;

		/* Remove no longer needed request tokens */
		unset($_SESSION['oauth_token']);
		unset($_SESSION['oauth_token_secret']);

		/* If HTTP response is 200 continue otherwise send to connect page to retry */
		if (200 == $connection->http_code) {
			/* The user has been verified and the access tokens can be saved for future use */
			$_SESSION['status'] = 'verified';
			header('Location: http://<tudominio>/oauth/index/');
		} else {
			/* Save HTTP status for error dialog on connnect page.*/
			header('Location: http://<tudominio>/oauth/_register/');
		}
		die();
	}

}
?>


  • Por último, creamos las vistas:

views/oauth/index.phtml:

<?php echo $msg; ?>

views/oauth/_register.phtml:

<a href="http://twitbot.gmbros.net/oauth/_redirect/"><img src="/img/lighter.png" alt="Sign in with Twitter"/></a>


  • Ya esta! Ahora ya puedes visitar la URL de tu controlador en http://<tudominio>/oauth y probarlo. La primera vez se te pedirá autorizar a la aplicación, pero una vez hecho, ya no hará falta.


Para cualquier duda, podeis enviarme un email o buscarme por el IRC.


Saludos,

Soukron