Extension for Yii2 providing an oAuth 2 server
Forked from https://github.com/davidxu/yii2-oauth2-server
Uses parts of https://github.com/samdark/yii2-league-oauth2-server, (*1)
Also inspired by https://github.com/chervand/yii2-oauth2-server, (*2)
Install
Add this to your composer.json:, (*3)
"davidxu/yii2-oauth2-server": "*"
Usage
Step 1
You need a few things:, (*4)
- 
A UserRepository for this module to get its users from. The easiest is to take your existing Userclass, and make sure it also implements the following interfaces:, (*5)
 
- yii\web\IdentityInterface
- League\OAuth2\Server\Entities\UserEntityInterface
- 
League\OAuth2\Server\Repositories\UserRepositoryInterface- Make sure to validate the user in UserRepositoryInterface::getUserEntityByUserCredentials()
 
 Also make sure to implement findIdentityByAccessToken(), it's used bydavidxu\oauth2\components\authMethods\HttpBearerAuthto authenticate the user by access token. Example:, (*6)
 <?php
  /**
 * {@inheritdoc}
 */
public static function findIdentityByAccessToken($token, $type = null) {
    return static::find()
        ->where(['user.status'=>static::STATUS_ACTIVE])
        ->leftJoin('{{%oauth_access_token}}', '`user`.`id` = `{{%oauth_access_token}}`.`user_id`')
        ->andWhere(['{{%oauth_access_token}}.identifier' => $token])
        ->one();
}
And then pass the User class as the property $userRepositoryin the configuration array as below., (*7)
 
- 
An SSH key pair. See https://oauth2.thephpleague.com/installation/, (*8) 
$ openssl genrsa -out private.key 2048
```bash
$ openssl rsa -in private.key -pubout -out public.key, (*9)
Make sure the file rights are 600 or 660 for the generated key files.
- An encryption key (just a random string)
- The migrations
```bash
$ php yii migrate --migrationPath=@vendor/davidxu/yii2-oauth2-server/migrations
Step 2
Add it as a yii2 module:, (*10)
<?php
$config = [
 'modules' => [
        'oauth2' => [
            'class' => davidxu\oauth2\Module::class,
            'userRepository' => \app\models\User::class,
            'privateKey' => '@common/data/keys/private.key',
            'publicKey' => '@common/data/keys/public.key',
            'encryptionKey' => 'put-a-nice-random-string-here',
        ],
    ],
];
?>
Also add the module to your application bootstrap:, (*11)
...
'bootstrap' => ['log','api.v1',...,'oauth2'],
...
Configuration
There's not a lot of configuration yet. Maybe the types of grants available will be dynamic someday., (*12)
Access control (Guarding API calls)
Check Client Credentials
Because the Client Credentials method creates access tokens that are not linked to a specific user, it uses a different filter to check the validity of the token., (*13)
Add the davidxu\oauth2\components\filters\CheckClientCredentials  to your behaviors to validate Client Credential access keys., (*14)
Other auth flows
Add the davidxu\oauth2\components\authMethods\HttpBearerAuth  to your behaviors, for example:, (*15)
<?php
 public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => HttpBearerAuth::class,
        ];
        $behaviors['contentNegotiator'] = [
            'class' => 'yii\filters\ContentNegotiator',
            'formats' => [
                'application/json' => Response::FORMAT_JSON,
            ]
        ];
        return $behaviors;
    }
Usage with with yiisoft/yii2-authclient (or similar Authorization Code Grant clients)
Create a custom client, with the following URLs:
- authorize URL: <domain>/oauth2/authorize
- token URL: <domain>/oauth2/token/create, (*16)