如何在用户撤销授权之前永久授权Google客户端?
我正在尝试创建一个连接到Google日历的应用.它必须在PHP中运行,因此我使用谷歌提供的Google API PHP客户端.
该应用程序需要具有脱机访问权限,以便在用户不在会话中时可以使用.该应用程序旨在让用户在网站等上公开管理和显示他的日历.
我使用服务方法(具有客户端ID和客户端密钥)在Google控制台中创建了凭据.使用Google API客户端,我还要求用户授权.我打开一个新的浏览器窗口,用户授权,Google会返回授权码.我使用此代码,存储并使用它来授权客户端,该客户端成功连接到Google日历并交换数据.
现在,我明白这是一个即将到期的令牌.除非我使用离线访问,我设置.但是,几分钟或更短时间后,我总会收到错误:Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.
这是我用来连接客户端的代码:
$client = new \Google_Client();
$client->setApplicationName( 'My App' );
$client->setScopes( array( \Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( 'offline' );
if ( $code = $this->google_client_auth ) {
try {
$client->authenticate( $code );
} catch( \Exception $e ) {
var_dump( $e );
}
}
return new \Google_Service_Calendar( $client );
Run Code Online (Sandbox Code Playgroud)
这是一个类中的方法.
客户端ID和客户端密钥存储在应用程序设置中.
我也将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我在一个单独的方法(也使用相同的客户端ID)中将链接放到Google OAuth窗口并秘密和设置离线方法).并获得授权工作.我可以到达日历.它只是不会持续很长时间...
我已在PHP应用程序中正确实现了Google API客户端.我能够连接到我想要的服务.
但现在我想检查用户输入的API密钥是否有效.
我查看了Google_Client()类公开的方法,但我认为我不确定如何检查.
下面是我的类中创建客户端的方法:
private function client( $api_key ) {
$client = new \Google_Client();
$client->setClassConfig( 'Google_Cache_File', 'directory', $this->cache_dir );
$client->setDeveloperKey( $api_key );
$client->setApplicationName( $this->name );
$client->setScopes( array( \Google_Service_Calendar::CALENDAR_READONLY ) );
$client->setAccessType( 'online' );
return $client;
}
Run Code Online (Sandbox Code Playgroud)
我想制作另一种方法来判断使用的API密钥是否有效......
public function validate_api_key( $api_key ) {
$client = $this->client( $api_key );
// What should I use here to check if $api_key is valid?
if ( $client ) {
return true;
}
return 'error';
}
Run Code Online (Sandbox Code Playgroud)
或者我应该连接到服务,然后检查我是否有读取访问权限?但我相信有一种更简单,更好的方法可以做到这一点......
我有一些 CSS 和 HTML,如下所示。有一段 JavaScript 代码可以将 .tab 转换为 #tab-container 的选项卡式元素。由于 #tab-container 具有固定的宽度和高度,如果 .tab 的内容超过宽度/高度,则会隐藏或溢出。对于 UL,我希望它溢出并在 div.tab 内有滚动条。只应出现水平滚动条。我尝试使用下面的代码,但由于某种原因我只能垂直滚动(LI填充宽度限制,然后出现更多行......我只想要一行+水平滚动)。我认为我不能真正更改这两个 DIV,否则选项卡将被破坏。我需要 .tab 层内的解决方案。
HTML:
<div id="tab-container">
<div class="tab">
<ul>
<li><img src="img01.png" width="96" height="96" /></li>
<li><img src="img02.png" width="96" height="96" /></li>
<li><img src="img03.png" width="96" height="96" /></li>
<li><img src="img04.png" width="96" height="96" /></li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
#tab-container { width: 500px; height: 200px; position: relative; overflow: hidden; }
.tab { position: relative; overflow: hidden;}
#tab-container .tab ul { position: absolute; width: auto; display: block; overflow: scroll; }
#tab-container …
Run Code Online (Sandbox Code Playgroud) 我在Windows上运行PHPStorm IDE.
我想开始使用Zurb Foundation并使用SCSS编写我的样式表.我需要安装Ruby或Compass才能这样做吗?
有没有办法让PHPStorm在编辑.scss文件的时候在我的项目中(在每个项目的自定义路径中)为我自动编译.css样式表?
我已经看过这个http://www.jetbrains.com/phpstorm/webhelp/transpiling-sass-less-and-scss-to-css.html,但看起来是针对unix系统的说明,而我运行的是Windows.
到目前为止,我做了以下事情:
此时该怎么办?使用Compass变量为我的项目定义config.rb,以查找SASS文件的位置以及编译它们的位置?我还该怎么办?
我有一个字符串,括号中包含可变数量的键名,例如:
$str = '[key][subkey][otherkey]';
Run Code Online (Sandbox Code Playgroud)
我需要创建一个多维数组,该数组具有在字符串中表示的相同键($value
这里只是一个不重要的字符串值):
$arr = [ 'key' => [ 'subkey' => [ 'otherkey' => $value ] ] ];
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢这种其他符号:
$arr['key']['subkey']['otherkey'] = $value;
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想像对待字符串那样追加数组键,但据我所知,这是不可能的.我认为array_push()
在这里没有帮助.起初我以为我可以使用正则表达式从字符串中获取方括号中的值:
preg_match_all( '/\[([^\]]*)\]/', $str, $has_keys, PREG_PATTERN_ORDER );
Run Code Online (Sandbox Code Playgroud)
但我只有一个没有任何层次结构的非关联数组,这对我没用.
所以我提出了以下几点:
$str = '[key][subkey][otherkey]';
$value = 'my_value';
$arr = [];
preg_match_all( '/\[([^\]]*)\]/', $str, $has_keys, PREG_PATTERN_ORDER );
if ( isset( $has_keys[1] ) ) {
$keys = $has_keys[1];
$k = count( $keys );
if ( $k > 1 ) {
for ( $i=0; $i<$k-1; $i++ ) …
Run Code Online (Sandbox Code Playgroud) 我有一个普通的一维数组,我们称它为$ myarray,其中几个键的范围从[0]到[34].有些钥匙可能是空的.
假设我想在foreach循环中使用这样的数组
$i = 1;
$choices = array(array('text' => ' ', 'value' => ' '));
foreach ( $myarray as $item ) :
$count = $i++;
$choices[] = array('text' => $count, 'value' => $count, 'price' => $item);
endforeach;
Run Code Online (Sandbox Code Playgroud)
我希望在这个foreach循环中跳过所有空键,因此我在这里构建的另一个数组($ choices)可能比$ myarray的行数少.但与此同时,正如您所看到的,我计算循环,因为我需要增加一个数字作为正在构建的新数组的一个键的值.计数应该是渐进的(1..2..3..4 ......).
谢谢
php ×4
arrays ×2
google-api ×2
api-key ×1
client ×1
compass-sass ×1
css ×1
foreach ×1
google-oauth ×1
html ×1
key ×1
oauth ×1
overflow ×1
phpstorm ×1
positioning ×1
regex ×1
ruby ×1
sass ×1
scrollbars ×1
string ×1
windows ×1