2017 © Pedro Peláez
 

yii2-extension yii2-oauth2-server

OAuth2 Server for PHP Framework Yii2

image

alegz/yii2-oauth2-server

OAuth2 Server for PHP Framework Yii2

  • Tuesday, August 23, 2016
  • by alegz
  • Repository
  • 2 Watchers
  • 0 Stars
  • 18 Installations
  • PHP
  • 2 Dependents
  • 0 Suggesters
  • 163 Forks
  • 0 Open issues
  • 12 Versions
  • 0 % Grown

The README.md

yii2-oauth2-server

A wrapper for implementing an OAuth2 Server(https://github.com/bshaffer/oauth2-server-php), (*1)

Important

This is fork of original (https://github.com/Filsh/yii2-oauth2-server) repo was also submited as a separate package but code namespaces are saved., (*2)

Reason for that is no update on original repo for a long time. Me and my friends have applied some usefull patches with fixes and improvements. Fixed branches mess. Latest stable version is now in master. Please see closed pull requests for more information what changes were made to master (https://github.com/Alegzander/yii2-oauth2-server/pulls?q=is%3Apr+is%3Aclosed), (*3)

Installation

The preferred way to install this extension is through composer., (*4)

Either run, (*5)

php composer.phar require --prefer-dist alegz/yii2-oauth2-server "*"

or add, (*6)

"alegz/yii2-oauth2-server": "~2.0"

to the require section of your composer.json., (*7)

To use this extension, simply add the following code in your application configuration as a new module:, (*8)

'bootstrap' => ['oauth2'],
'modules' => [
    'oauth2' => [
        'class' => 'filsh\yii2\oauth2server\Module',
        'tokenParamName' => 'accessToken',
        'tokenAccessLifetime' => 3600 * 24,
        'storageMap' => [
            'user_credentials' => 'common\models\User',
        ],
        'grantTypes' => [
            'user_credentials' => [
                'class' => 'OAuth2\GrantType\UserCredentials',
            ],
            'refresh_token' => [
                'class' => 'OAuth2\GrantType\RefreshToken',
                'always_issue_new_refresh_token' => true
            ]
        ]
    ]
]

If you want to get Json Web Token (JWT) instead of convetional token, you will need to set 'useJwtToken' => true in module and then define two more configurations: 'public_key' => 'app\storage\PublicKeyStorage' which is the class that implements PublickKeyInterface and 'access_token' => 'app\storage\JwtAccessToken' which implements JwtAccessTokenInterface.php, (*9)

common\models\User - user model implementing an interface \OAuth2\Storage\UserCredentialsInterface, so the oauth2 credentials data stored in user table For Oauth2 base library provides the default access_token which works great except that it tries to save the token in the database. So I decided to inherit from it and override the part that tries to save (token size is too big and crashes with VARCHAR(40) in the database., (*10)

TL;DR, here are the sample classes access_token, (*11)

<?php

namespace app\storage;

/**
 *
 * @author Stefano Mtangoo <mwinjilisti at gmail dot com>
 */
class JwtAccessToken extends \OAuth2\Storage\JwtAccessToken
{
    public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null)
    {

    }

    public function unsetAccessToken($access_token)
    {

    }
}

and public_key, (*12)

<?php
namespace app\storage;

class PublicKeyStorage implements \OAuth2\Storage\PublicKeyInterface{


    private $pbk =  null;
    private $pvk =  null;

    public function __construct()
    {
        //files should be in same directory as this file
        //keys can be generated using OpenSSL tool with command:
        /*
          private key:
          openssl genrsa -out privkey.pem 2048

          public key:
          openssl rsa -in privkey.pem -pubout -out pubkey.pem
        */
        $this->pbk =  file_get_contents('privkey.pem', true);
        $this->pvk =  file_get_contents('pubkey.pem', true);
    }

    public function getPublicKey($client_id = null){
        return  $this->pbk;
    }

    public function getPrivateKey($client_id = null){
        return  $this->pvk;
    }

    public function getEncryptionAlgorithm($client_id = null){
        return 'HS256';
    }

}

NOTE: You will need this PR applied or you can patch it yourself by checking changes in this diff. The other part of PR is only if you want to use firebase JWT library (which is not mandatory anyway)., (*13)

Also, extend common\models\User - user model - implementing the interface \OAuth2\Storage\UserCredentialsInterface, so the oauth2 credentials data stored in user table. You should implement: - findIdentityByAccessToken() - checkUserCredentials() - getUserDetails(), (*14)

You can extend the model if you prefer it (please, remember to update the config files) :, (*15)

use Yii;

class User extends common\models\User implements \OAuth2\Storage\UserCredentialsInterface
{

    /**
     * Implemented for Oauth2 Interface
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        /** @var \filsh\yii2\oauth2server\Module $module */
        $module = Yii::$app->getModule('oauth2');
        $token = $module->getServer()->getResourceController()->getToken();
        return !empty($token['user_id'])
                    ? static::findIdentity($token['user_id'])
                    : null;
    }

    /**
     * Implemented for Oauth2 Interface
     */
    public function checkUserCredentials($username, $password)
    {
        $user = static::findByUsername($username);
        if (empty($user)) {
            return false;
        }
        return $user->validatePassword($password);
    }

    /**
     * Implemented for Oauth2 Interface
     */
    public function getUserDetails($username)
    {
        $user = static::findByUsername($username);
        return ['user_id' => $user->getId()];
    }
}

Additional OAuth2 Flags:, (*16)

enforceState - Flag that switch that state controller should allow to use "state" param in the "Authorization Code" Grant Type, (*17)

allowImplicit - Flag that switch that controller should allow the "implicit" grant type, (*18)

The next step your shold run migration, (*19)

yii migrate --migrationPath=@vendor/filsh/yii2-oauth2-server/migrations

this migration create the oauth2 database scheme and insert test user credentials testclient:testpass for http://fake/, (*20)

add url rule to urlManager, (*21)

'urlManager' => [
    'enablePrettyUrl' => true, //only if you want to use petty URLs
    'rules' => [
        'POST oauth2/<action:\w+>' => 'oauth2/rest/<action>',
        ...
    ]
]

Usage

To use this extension, simply add the behaviors for your base controller:, (*22)

use yii\helpers\ArrayHelper;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
use filsh\yii2\oauth2server\filters\ErrorToExceptionFilter;
use filsh\yii2\oauth2server\filters\auth\CompositeAuth;

class Controller extends \yii\rest\Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return ArrayHelper::merge(parent::behaviors(), [
            'authenticator' => [
                'class' => CompositeAuth::className(),
                'authMethods' => [
                    ['class' => HttpBearerAuth::className()],
                    ['class' => QueryParamAuth::className(), 'tokenParam' => 'accessToken'],
                ]
            ],
            'exceptionFilter' => [
                'class' => ErrorToExceptionFilter::className()
            ],
        ]);
    }
}

Create action authorize in site controller for Authorization Code, (*23)

https://api.mysite.com/authorize?response_type=code&client_id=TestClient&redirect_uri=https://fake/, (*24)

see more, (*25)

/**
 * SiteController
 */
class SiteController extends Controller
{
    /**
     * @return mixed
     */
    public function actionAuthorize()
    {
        if (Yii::$app->getUser()->getIsGuest())
            return $this->redirect('login');

        /** @var $module \filsh\yii2\oauth2server\Module */
        $module = Yii::$app->getModule('oauth2');
        $response = $module->handleAuthorizeRequest(!Yii::$app->getUser()->getIsGuest(), Yii::$app->getUser()->getId());

        /** @var object $response \OAuth2\Response */
        Yii::$app->getResponse()->format = \yii\web\Response::FORMAT_JSON;

        return $response->getParameters();
    }
}

Also if you set allowImplicit => true you can use Implicit Grant Type - see more, (*26)

Request example:, (*27)

https://api.mysite.com/authorize?response_type=token&client_id=TestClient&redirect_uri=https://fake/cb, (*28)

With redirect response:, (*29)

https://fake/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=bearer&expires_in=3600, (*30)

If you want to get Json Web Token (JWT) instead of convetional token, you will need to set 'useJwtToken' => true in module and then define two more configurations: 'public_key' => 'app\storage\PublicKeyStorage' which is the class that implements PublickKeyInterface and 'access_token' => 'app\storage\JwtAccessToken' which implements JwtAccessTokenInterface.php, (*31)

For Oauth2 base library provides the default access_token which works great except that it tries to save the token in the database. So I decided to inherit from it and override the part that tries to save (token size is too big and crashes with VARCHAR(40) in the database., (*32)

TL;DR, here are the sample classes access_token, (*33)

<?php

namespace app\storage;

/**
 *
 * @author Stefano Mtangoo <mwinjilisti at gmail dot com>
 */
class JwtAccessToken extends \OAuth2\Storage\JwtAccessToken
{
    public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null)
    {

    }

    public function unsetAccessToken($access_token)
    {

    }
}

and public_key, (*34)

<?php
namespace app\storage;

class PublicKeyStorage implements \OAuth2\Storage\PublicKeyInterface{


    private $pbk =  null;
    private $pvk =  null;

    public function __construct()
    {
        //files should be in same directory as this file
        //keys can be generated using OpenSSL tool with command:
        /*
          private key:
          openssl genrsa -out privkey.pem 2048

          public key:
          openssl rsa -in privkey.pem -pubout -out pubkey.pem
        */
        $this->pbk =  file_get_contents('privkey.pem', true);
        $this->pvk =  file_get_contents('pubkey.pem', true);
    }

    public function getPublicKey($client_id = null){
        return  $this->pbk;
    }

    public function getPrivateKey($client_id = null){
        return  $this->pvk;
    }

    public function getEncryptionAlgorithm($client_id = null){
        return 'HS256';
    }

}

To get access token (js example):, (*35)

var url = window.location.host + "/oauth2/token";
var data = {
    'grant_type':'password',
    'username':'<some login from your user table>',
    'password':'<real pass>',
    'client_id':'testclient',
    'client_secret':'testpass'
};
//ajax POST `data` to `url` here
//

To get access token (js example):, (*36)

var url = window.location.host + "/oauth2/token";
var data = {
    'grant_type':'password',
    'username':'<some login from your user table>',
    'password':'<real pass>',
    'client_id':'testclient',
    'client_secret':'testpass'
};
//ajax POST `data` to `url` here
//

For more, see https://github.com/bshaffer/oauth2-server-php, (*37)

The Versions

23/08 2016

dev-master

9999999-dev https://github.com/Alegzander/yii2-oauth2-server

OAuth2 Server for PHP Framework Yii2

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

05/07 2016

2.2.3

2.2.3.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

03/06 2016

2.2.2

2.2.2.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

03/06 2016

2.2.1

2.2.1.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

03/06 2016

2.2

2.2.0.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

29/04 2016

v2.0.1.x-dev

2.0.1.9999999-dev https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

11/02 2016

dev-musicdirector

dev-musicdirector https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

06/01 2016

v2.1

2.1.0.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

19/06 2015

v2.0.x-dev

2.0.9999999.9999999-dev https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

19/06 2015

2.0.1

2.0.1.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

17/06 2015

v2.0.0

2.0.0.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension oauth module yii oauth2

10/04 2015

v1.0

1.0.0.0 https://github.com/filsh/yii2-oauth2-server

OAuth2 Server for PHP

  Sources   Download

MIT

The Requires

 

by Igor Maliy

extension yii widget