evgenidev / yii2-simple-oauth2server
适用于 Yii2 的简单 PHP OAuth2 服务器
此软件包的官方仓库似乎已消失,因此软件包已被冻结。
Requires
- php: >=7.1.0
- yiisoft/yii2: >=2.0.5
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(); } }