evgenidev / yii2-oauth2
为Yii2的简单PHP OAuth2服务器
Requires
- php: >=7.1.0
- yiisoft/yii2: >=2.0.5
This package is auto-updated.
Last update: 2024-09-29 06:14:36 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' => [ 'oauth2', ],
如果你要添加自定义授权视图文件,请简单地在oauth2模块中添加一个authorizeView参数。
'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/evgenidev/yii2-oauth2/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, ], ],
在你的项目中创建一个迁移,并从\EvgeniDev\Yii2\OAuth2\Migrations\Oauth扩展。
use EvgeniDev\Yii2\OAuth2\Migrations\OAuth2; /** * Your oauth migration. */ class m191117_223223_oauth extends OAuth2 { }
此迁移创建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/evgenidev/yii2-oauth2/Records/*
和
./vendor/evgenidev/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(); } }