bnviking / yii2-oauth2
OAuth2.0 Yii2 扩展
v1.1.1
2022-04-09 14:57 UTC
Requires
- php: >=7.4
- yiisoft/yii2: ~2.0.13
- yiisoft/yii2-httpclient: ~2.0.5
This package is auto-updated.
Last update: 2024-09-09 20:58:11 UTC
README
OAuth2.0
Yii2 框架的扩展
以下客户端当前支持授权
- vk.com [注册您的应用]
- mail.ru [注册您的应用]
- yandex.ru [注册您的应用]
- discord.com [注册您的应用]
- trovo.live [注册您的应用]
- twitch.tv [注册您的应用]
安装
安装此扩展的最佳方式是通过 [composer] (http://getcomposer.org/download/).
运行以下命令之一:
php composer.phar require --prefer-dist bnviking/yii2-oauth2 "~v1.1.1"
或者将以下内容添加到您的 composer.json
文件的 require 部分。
"bnviking/yii2-oauth2": "~v1.1.1"
配置
创建 OAuth2 链接
'components' => [ ... 'bnvOAuth2'=> [ 'class' => \bnviking\oauth2\OAuth2Config::class, 'clientUrlName' => 'client', 'authUrl' => 'auth2/authorize', 'clients' => [ 'discord'=>[ 'class'=> \bnviking\oauth2\clients\Discord::class, 'clientID' => 'discord_client_id', 'clientSecret' => 'discord_client_secret', ], 'vkontakte'=>[ 'class'=> \bnviking\oauth2\clients\VKontakte::class, 'clientID' => 'vkontakte_client_id', 'clientSecret' => 'vkontakte_client_secret', ], 'yandex'=>[ 'class'=> \bnviking\oauth2\clients\Yandex::class, 'clientID' => 'yandex_client_id', 'clientSecret' => 'yandex_client_secret', ], 'mailru'=>[ 'class'=> \bnviking\oauth2\clients\MailRu::class, 'clientID' => 'mailru_client_id', 'clientSecret' => 'mailru_client_secret', ], 'trovo'=>[ 'class'=> \bnviking\oauth2\clients\Trovo::class, 'clientID' => 'trovo_client_id', 'clientSecret' => 'trovo_client_secret', ], 'twitch'=>[ 'class'=> \bnviking\oauth2\clients\Twitch::class, 'clientID' => 'twitch_client_id', 'clientSecret' => 'twitch_client_secret', ], ] ] ... ]
clientUrlName - 创建 URL 的客户端 ID 名称参数
- authUrl -
<controller>
/<action>
- 您的 APP 重定向 URL: https://my.site/controller/action
在动作中使用
小部件
<?php namespace app\controllers; use bnviking\oauth2\OAuth2; use yii\web\Controller; use Yii; class Auth2Controller extends Controller { public function actionAuthorize(): string { /** @var \bnviking\oauth2\components\AuthResult $authResult */ $authResult = OAuth2::init(); if ($authResult->hasError()) { $errors = $authResult->getErrors(); Yii::$app->session->setFlash('error', implode('<br>', $errors)); $this->goHome(); return ''; } if ($authResult->getAction() === AuthResult::ACTION_ENTERS_SITE) { /** @var \bnviking\oauth2\components\OAuth2BaseClient $clientData Auth client data */ $clientData = $authResult->getClient(); /** @var \bnviking\oauth2\components\UserResult $userData User data */ $userData = $authResult->getUser(); /* * property $userData: * id - User ID * email - User email * username - User name * token - Auth token * tokenReset - Reset token * tokenType - Token Type * tokenExpires - Token lifetime [seconds] */ /* * Here you can register or enter the site */ } ... } }
小部件
<?=\bnviking\oauth2\widgets\OAuth2Buttons::widget()?>
小部件的额外 HTML 选项
'components' => [ ... 'bnvOAuth2'=> [ 'clients' => [ ... 'htmlOptions' => ['class'=>'my-css-class'] ] ] ]
自定义小部件示例
可以使用 ClientManager 获取所有客户端
widget.php
<?php use bnviking\oauth2\components\ClientsManager; use bnviking\oauth2\exception\OAuth2Exception; use yii\base\Widget; class OAuth2Buttons extends Widget { public function run(): string { $error = ''; $clients = []; try { $clientManager = new ClientsManager(); /** @var \bnviking\oauth2\components\OAuth2BaseClient[] $clients Auth client data */ $clients = $clientManager->getClients(); } catch (OAuth2Exception $e) { $error = $e->getMessage(); } return $this->render('view-widget',['clients' => $clients,'error' => $error]); } }
view-widget.php
<?php /* @var yii\web\View $this */ /* @var OAuth2BaseClient[] $clients */ /* @var string $error */ use bnviking\oauth2\components\OAuth2BaseClient; use bnviking\oauth2\exception\OAuth2Exception; use yii\helpers\Html; \bnviking\oauth2\OAuth2Bundle::register($this); ?> <div class="row"> <div class="col-lg-12 text-center"> <?php if ($error!== '') { echo Html::tag('div',$error,['class'=>'alert alert-danger','role'=>'alert']); } echo Html::beginTag('div',['class'=>'btn-group']); foreach ($clients as $clientId => $client) { echo Html::a('', $client->url, $client->htmlOptions); } echo Html::endTag('div'); ?> </div> </div>