mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-08 00:47:55 +08:00
yii\authclient\GoogleSignInButton created
This commit is contained in:
150
extensions/authclient/widgets/GoogleSignInButton.php
Normal file
150
extensions/authclient/widgets/GoogleSignInButton.php
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace yii\authclient\widgets;
|
||||||
|
|
||||||
|
use yii\authclient\clients\GoogleOAuth;
|
||||||
|
use yii\base\InvalidConfigException;
|
||||||
|
use yii\base\Widget;
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\helpers\Url;
|
||||||
|
use yii\web\View;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GoogleSignInButton renders Google+ sign-in button.
|
||||||
|
* This widget is designed to interact with [[GoogleOAuth]].
|
||||||
|
*
|
||||||
|
* @see GoogleOAuth
|
||||||
|
* @see https://developers.google.com/+/web/signin/
|
||||||
|
*
|
||||||
|
* @property string|array $callback
|
||||||
|
*
|
||||||
|
* @author Paul Klimov <klimov.paul@gmail.com>
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class GoogleSignInButton extends Widget
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var GoogleOAuth google auth client instance.
|
||||||
|
*/
|
||||||
|
public $client;
|
||||||
|
/**
|
||||||
|
* @var array button tag HTML options, which will be merged with the default ones.
|
||||||
|
*/
|
||||||
|
public $buttonHtmlOptions = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|array name of the JavaScript function, which should be used as sign-in callback.
|
||||||
|
* If blank default one will be generated: it will redirect page to the auth action using auth result
|
||||||
|
* as GET parameters.
|
||||||
|
* You may pass an array configuration of the URL here, which
|
||||||
|
* will be used creating default callback.
|
||||||
|
*/
|
||||||
|
private $_callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $callback
|
||||||
|
*/
|
||||||
|
public function setCallback($callback)
|
||||||
|
{
|
||||||
|
$this->_callback = $callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCallback()
|
||||||
|
{
|
||||||
|
if (empty($this->_callback)) {
|
||||||
|
$this->_callback = $this->generateCallback();
|
||||||
|
} elseif (is_array($this->_callback)) {
|
||||||
|
$this->_callback = $this->generateCallback($this->_callback);
|
||||||
|
}
|
||||||
|
return $this->_callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the widget.
|
||||||
|
*/
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
if (!($this->client instanceof GoogleOAuth)) {
|
||||||
|
throw new InvalidConfigException('"' . $this->className() . '::client" must be instance of "' . GoogleOAuth::className() . '"');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the widget.
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
$this->registerClientScript();
|
||||||
|
return $this->renderButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateCallback($url = null)
|
||||||
|
{
|
||||||
|
if (empty($url)) {
|
||||||
|
$url = ['auth', 'authclient' => $this->client->id];
|
||||||
|
}
|
||||||
|
$url = Url::to($url);
|
||||||
|
if (strpos($url, '?') === false) {
|
||||||
|
$url .= '?';
|
||||||
|
} else {
|
||||||
|
$url .= '&';
|
||||||
|
}
|
||||||
|
|
||||||
|
$callbackName = 'googleSignInCallback' . md5($this->id);
|
||||||
|
$js = <<<JS
|
||||||
|
function $callbackName(authResult) {
|
||||||
|
var urlParams = [];
|
||||||
|
for (var propName in authResult) {
|
||||||
|
urlParams.push(encodeURIComponent(propName) + '=' + encodeURIComponent(authResult[propName]));
|
||||||
|
}
|
||||||
|
window.location = '$url' + urlParams.join('&');
|
||||||
|
}
|
||||||
|
JS;
|
||||||
|
$this->view->registerJs($js, View::POS_END, __CLASS__ . '#' . $this->id);
|
||||||
|
|
||||||
|
return $callbackName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers necessary JavaScript.
|
||||||
|
*/
|
||||||
|
protected function registerClientScript()
|
||||||
|
{
|
||||||
|
$js = <<<JS
|
||||||
|
(function() {
|
||||||
|
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
|
||||||
|
po.src = 'https://apis.google.com/js/client:plusone.js';
|
||||||
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
|
||||||
|
})();
|
||||||
|
JS;
|
||||||
|
$this->view->registerJs($js, View::POS_END, __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders sign-in button.
|
||||||
|
* @return string button HTML.
|
||||||
|
*/
|
||||||
|
protected function renderButton()
|
||||||
|
{
|
||||||
|
$buttonHtmlOptions = array_merge(
|
||||||
|
[
|
||||||
|
'class' => 'g-signin',
|
||||||
|
'data-callback' => $this->getCallback(),
|
||||||
|
'data-clientid' => $this->client->clientId,
|
||||||
|
'data-cookiepolicy' => 'single_host_origin',
|
||||||
|
'data-requestvisibleactions' => null,
|
||||||
|
'data-scope' => $this->client->scope,
|
||||||
|
],
|
||||||
|
$this->buttonHtmlOptions
|
||||||
|
);
|
||||||
|
return Html::tag('span', Html::tag('span', '', $buttonHtmlOptions), ['id' => 'signinButton']);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user