evgenidev/yii2-simple-oauth2server

适用于 Yii2 的简单 PHP OAuth2 服务器

此软件包的官方仓库似乎已消失,因此软件包已被冻结。

2.0.0 2021-12-01 06:54 UTC

This package is auto-updated.

Last update: 2021-12-01 06:56:09 UTC


README

安装

安装此扩展的首选方法是使用 composer

运行以下命令之一:

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

或添加

"evgenidev/yii2-oauth2": "*"

到你的 composer.json 文件的 require 部分。

要使用此扩展,请在你的应用程序配置中添加以下代码

'modules' => [
    'oauth2' => [
        'class' => \EvgeniDev\Yii2\Oauth2\Module::class,
        'accessTokenLifetime' => 3600 * 12,
        'identityClass' => \app\models\User::class,
    ],
],

还要添加 bootstrap 参数

'bootstrap' => [
    'oauth2',
],

如果你想要添加自定义的授权视图文件,只需将 authorizeView 参数添加到 oauth2 模块中。

'modules' => [
    'oauth2' => [
        'class' => \EvgeniDev\Yii2\Oauth2\Module::class::class,
        'accessTokenLifetime' => 3600 * 12,
        'identityClass' => \app\models\User::class,
        'authorizeViewPath' => '@app/views/your_view',
        'layout' => '@app/views/your_layout',
    ],
],

基本的授权视图可以在这里找到

./vendor/yii2-simple-oauth2server/src/views/authorize/index.php

对于单页应用程序(SPA),你应该配置 spaApp 参数。默认情况下,你将从服务器获得 JSON 格式的响应。如果你需要其他响应格式,可以添加 responseFormat 参数

use yii\web\Response;

'modules' => [
    'oauth2' => [
        'class' => \EvgeniDev\Yii2\Oauth2\Module::class,
        'accessTokenLifetime' => 3600 * 12,
        'identityClass' => \app\models\User::class,
        'spaApp' => true,
        'responseFormat' => Response::FORMAT_XML,
    ],
],

下一步是运行迁移。

./yii migrate --migrationPath=@vendor/evgenidev/yii2-oauth2/Migrations

此迁移创建 oauth2 数据库模式并插入测试数据。

在下一步中,你应该向 urlManager 添加 URL 规则,如下所示

'urlManager' => [
    'rules' => [
        'oauth2/authorize' => 'oauth2/authorize',
        'oauth2/access_token' => 'oauth2/access-token',
    ],
],

使用方法

添加新的 OAuth 客户端很简单。使用以下命令

./yii oauth2/default/create-client http://redirect.com clientName

示例 GET 请求以获取代码

https://yoursite.com/oauth/authorize?response_type=code&client_id=clientID&state=someState&redirect_uri=http://site.com/url

带有重定向响应

http://site.com/url?code=gjkmo5ufhvkdmjgnbdJklsdfFQPfdfg456nfdsjfnjsdnf&state=someState

之后,你需要进行带有以下参数的 POST 请求

https://yoursite.com/oauth/access_token

"grant_type": "authorization_code"
"code": "gjkmo5ufhvkdmjgnbdJklsdfFQPfdfg456nfdsjfnjsdnf"
"client_id": "testClientID"
"client_secret": "testClientSecret"
"redirect_uri": "http://site.com/url"

如果用户未授权,模块将重定向到 Yii::$app->user->loginUrl 并带有 GET 参数 redirectUrl

https://yoursite.com/loginUrl?redirectUrl=xxx

因此,你可以在成功授权后重定向用户到 redirectUrl。

如果你想要通过界面(如管理员)控制 OAuth2 服务器,你可以在以下位置找到所有必要的模型

./vendor/yii2-oauth2/Records/*

./vendor/yii2-oauth2/Services/*

要使用此扩展,只需添加基础控制器的行为

use yii\helpers\ArrayHelper;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;

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

为了识别客户端,你可以在你的用户身份 AR 模型中使用 findIdentityByAccessToken() 函数

use EvgeniDev\Yii2\Oauth2\Records\OAuthAccessToken;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

/**
 * User AR model.
 */
class User extends ActiveRecord implements IdentityInterface
{
    /**
     * {@inheritDoc}
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        $oauthToken = OAuthAccessToken::find()
            ->byAccessToken($token)
            ->one();
    
        if ($oauthToken === null || $oauthToken->getExpiresAt() < date('Y-m-d H:i:s')) {
            return null;
        }
    
        return self::find()
            ->where(['id' => $oauthToken->getUserID()])
            ->one();
    }
}