Giter Site home page Giter Site logo

thinkscape / reverseoauth2 Goto Github PK

View Code? Open in Web Editor NEW

This project forked from silvester/reverseoauth2

0.0 3.0 0.0 130 KB

Another OAuth2 client for ZF2. It provides clients for github, google and facebook. It also provides a standart authentication adapter for zend auth. Others soon to come.

PHP 100.00%

reverseoauth2's Introduction

ReverseOAuth2

Build Status

Another OAuth2 client for ZF2. It provides clients for github, google and facebook others soon to come.

Demo

Minimum rights are used. If you feel intimidated revoke the rights. Click the login button.

Github: http://reverseform.modo.si/oauth-github

Google: http://reverseform.modo.si/oauth-google

Facebook: http://reverseform.modo.si/oauth-facebook

Installation with Composer

  1. Add this project in your composer.json:
    "require": {
        "silvester/reverse-oauth2": "dev-master",
    }
  1. Fetch the repository with composer:
$ php composer.phar update
  1. Enable it in your config/application.config.php file:
return array(
	'modules' => array(
		// ...
		'ReverseOAuth2',
	),
	// ...
);

Usage

As usual add it to your application.config.php 'ReverseOAuth2'.

Copy & rename the config/reverseoauth2.local.php.dist to your autoload folder and fill the information needed.

In your controller/action do:

public function callbackAction()
{

    $me = $this->getServiceLocator()->get('ReverseOAuth2\Google');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Github');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Facebook');

    if (strlen($this->params()->fromQuery('code')) > 10) {
    	
    	if($me->getToken($this->request)) {
    		$token = $me->getSessionToken(); // token in session
    	} else {
    		$token = $me->getError(); // last returned error (array)
    	}
        
        $info = $me->getInfo();
        
    } else {
    
        $url = $me->getUrl();
        
    }

    return array('token' => $token, 'info' => $info, 'url' => $url);

}

The action name depends on your settings. getUrl() will return the url where you should redirect the user, there is no automatic redirection do it yourself.

Client Configuration

Beside the configuration options in module.config.php and reverseoath2.local.php you can change the client configuration on runtime.

public function callbackAction()
{

    $me = $this->getServiceLocator()->get('ReverseOAuth2\Google');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Github');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Facebook');

	$me->getOptions()->setScope(array('email', 'user'));
	$me->getOptions()->setAuthUri('http://google.com/');
	$me->getOptions()->setTokenUri('http://google.com/');
	$me->getOptions()->setInfoUri('http://google.com/');
	$me->getOptions()->setClientId('my-id.com');
	$me->getOptions()->setClientSecret('my-secret');
	$me->getOptions()->setRedirectUri('http://my-server.com/');

}

The ReverseOAuth2 authentication adapter

The module provides also an zend\authentication\adapter.

public function authGithubAction() // controller action
{

    $me = $this->getServiceLocator()->get('ReverseOAuth2\Github');

    $auth = new AuthenticationService(); // zend
    
    if (strlen($this->params()->fromQuery('code')) > 10) {
         
        if($me->getToken($this->request)) { // if getToken is true, the user has authenticated successfully by the provider, not yet by us.
            $token = $me->getSessionToken(); // token in session
        } else {
            $token = $me->getError(); // last returned error (array)
        }
        
        $adapter = $this->getServiceLocator()->get('ReverseOAuth2\Auth\Adapter'); // added in module.config.php
        $adapter->setOAuth2Client($me); // $me is the oauth2 client
        $rs = $auth->authenticate($adapter); // provides an eventManager 'oauth2.success'
        
        if (!$rs->isValid()) {
            foreach ($rs->getMessages() as $message) {
                echo "$message\n";
            }
            echo 'no valid';
        } else {
            echo 'valid';
        }

    } else {
        $url = $me->getUrl();
    }

    $view = new ViewModel(array('token' => $token, 'info' => $info, 'url' => $url, 'error' => $me->getError()));
    
    return $view;

}

The adapter also provides an event called oauth2.success. Here you can check the data from the client against your user registry. You will be provided with information from the user, token info and provider type.

In your module class you could do:

public function onBootstrap(Event $e)
{
    /* Some bad code here, only for demo purposes. */
    $userTable = new UserTable($e->getApplication()->getServiceManager()->get('Zend\Db\Adapter\Adapter')); // my user table
    $e->getApplication()->getServiceManager()->get('ReverseOAuth2\Auth\Adapter')->getEventManager() // the the adapters eventmanager
        ->attach('oauth2.success', //attach to the event
            function($e) use ($userTable){
                
                $params = $e->getParams(); //print_r($params); so you see whats in if
                
                if($user = $userTable->getUserByRemote($params['provider'], $params['info']['id'])) { // check for user from facebook with id 1000
    
                    $user->token = $params['token']['access_token'];
                    $expire = (isset($params['token']['expires'])) ? $params['token']['expires'] : 3600;
                    $user->token_valid = new \Zend\Db\Sql\Expression('DATE_ADD(NOW(), INTERVAL '.$expire.' SECOND)');
                    $user->date_update = new \Zend\Db\Sql\Expression('NOW()');
                    
                    $userTable->saveUser($user);
                                    
                } else {
                    
                    $user = new User;
                    $user->token = $params['token']['access_token'];
                    $expire = (isset($params['token']['expires'])) ? $params['token']['expires'] : 3600;
                    $user->token_valid = new \Zend\Db\Sql\Expression('DATE_ADD(NOW(), INTERVAL '.$expire.' SECOND)');
                    $user->date_update = new \Zend\Db\Sql\Expression('NOW()');
                    $user->date_create = new \Zend\Db\Sql\Expression('NOW()');
                    $user->remote_source = $params['provider'];
                    $user->remote_id = $params['info']['id'];
                    $user->name = $params['info']['name'];
                    $user->info = \Zend\Json\Encoder::encode($params['info']);
                    
                    $userTable->saveUser($user);
                    
                }
                
                $user = $userTable->getUserByRemote($params['provider'], $params['info']['id']);
                $params['info'] = $user->getArrayCopy();
                $params['info']['info'] = false;
    
    			// here the params info is rewitten. The result object returned from the auth object will have the db row.
    			
    			$params['code'] = \Zend\Authentication\Result::FAILURE; // this would deny authentication. default is \Zend\Authentication\Result::SUCCESS.
    
            });

}

TODO

  • Add other clients
  • Write some decent documentation.
  • Demo module is on it's way.

reverseoauth2's People

Contributors

machek avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.