我在pubnub打开了一张票,并且还读到了:https://help.pubnub.com/entries/22251291-Can-I-Hide-my-Application-Keys-
但是我仍然无法理解如何阻止用户看到我的密钥,因为即使在混淆之后它仍然在客户端。
我想要做的是我在这篇文章中读到的内容:PubNub publish message between two Private Channels
我不确定如何使用用户无法看到的自定义键创建私人频道。
编辑: 我能够理解auth_key的流程,但无法找到JS crypto lib的php等效性来授予权限。关于如何在PHP中实现它的任何想法?
答案 0 :(得分:6)
您无法隐藏传输到客户端并可在JavaScript中访问的密钥。
但是,您可以通过使用auth_key
以及发布和订阅密钥来限制谁可以读取和写入频道。 PubNub最近发布了PubNub Access Manager以启用此功能。 auth_key
将特定于每个用户。
auth_key
将允许该用户读取和写入自己的私人频道。您需要设置权限,以便其他任何人都无法读取或写入此频道。auth_key
将授予他们读取和写入自己公共频道的权限。其他人可以阅读,但不能写入此频道。可能会在另一个问题中询问有关如何执行此操作的详细信息。 PAM getting started guide应该是最好的起点。
答案 1 :(得分:4)
使用PubNub Access Manager,您不再需要担心将您的publish_key
和subscribe_key
隐藏在JavaScript代码或其他任何语言的源代码中!通常,您会认为隐藏密钥会成为阻止访问PubNub通道上的数据流的一种方法。但是,这不是必需的,而是使用最佳实践方法:以下是新方式管理访问的解决方案以及管理密钥的新方法
您可以在PubNub全球实时网络上实时发出每用户连接grant()
和revoke()
访问权限。 PubNub网络中的各种安全级别使用授权/撤销(白名单)权限方案,其中在层次结构中找到的第一个授权授予读/写访问权限。根据此层次结构评估发布和订阅的权限。我们的pam.php
PubNub Access Manager PHP类终于准备好了!您可以通过查看下面的示例用法代码以及SDK的完整代码覆盖率开始。您可以通过GitHub Gist Link找到所有源代码:
PubNub Access Manager (PAM) PHP Full Library for Granting and Revoking Access
require('pam.php');
$manager = new access(
"pub-c-e132b7b4-0c2c-4d36-a828-1de1ea50d167",
"sub-c-f95db694-6ff9-11e3-9291-02ee2ddab7fe",
"sec-c-OWFkNWQ1NDctN2JiNy00NzJmLTk3Y2ItN2ExODZlYzkyNzY0"
);
授予对authkey
gZW5jb2RlZCBmaWx
read
write
5
及ttl
分钟authkey
分钟print_r($manager->grant(
"my_channel", // CHANNEL
"gZW5jb2RlZCBmaWx", // STRING (AUTH KEY)
true, // READ
true, // WRITE
5 // TTL in MINUTES
));
访问权限的用户的访问权限。 您可以将print_r($manager->grant(
"my_channel-pnpres", // CHANNEL
"gZW5jb2RlZCBmaWx", // STRING (AUTH KEY)
true, // READ
true, // WRITE
5 // TTL in MINUTES
));
设为您想要的任何内容!
authkey
还授予对状态通道的访问权限(PubNub Dev Console所需)。
print_r($manager->grant_global(
"my_channel", // CHANNEL
true, // READ
true, // WRITE
5 // TTL in MINUTES
));
排除ttl
,您可以全局授予对所有人的访问权限。
0
您可以通过将print_r($manager->grant_global(
"my_channel", // CHANNEL
true, // READ
true, // WRITE
0 // FOREVER GRANT!!!
));
参数设置为print_r($manager->revoke(
"some-other-channel", // CHANNEL
"gZW5jb2RlZCBmaWx" // STRING (AUTH KEY)
));
来永久授予访问权限。
authkey
立即撤消对用户的访问权限。
print_r($manager->revoke(
"some-other-channel" // CHANNEL
));
您也可以通过排除pam.php
参数来撤消全局访问。
<?php
class access {
function __construct( $pubkey, $subkey, $seckey ) {
$this->publish_key = $pubkey;
$this->subscribe_key = $subkey;
$this->secret_key = $seckey;
}
function grant_global( $channel, $read=True, $write=True, $ttl=5 ) {
/** Grant GLOBAL Access on a Channel. **/
return $this->_auth(array(
"channel" => $channel,
"r" => $read ? 1 : 0,
"w" => $write ? 1 : 0,
"ttl" => $ttl
));
}
function grant( $channel, $authkey=False, $read=True, $write=True, $ttl=5 ) {
/** Grant Access on a Channel. **/
return $this->_auth(array(
"channel" => $channel,
"auth" => $authkey,
"r" => $read ? 1 : 0,
"w" => $write ? 1 : 0,
"ttl" => $ttl
));
}
function revoke( $channel, $authkey=False, $read=False, $write=False, $ttl=1 ) {
/** Revoke Access on a Channel.**/
return $this->_auth(array(
"channel" => $channel,
"auth" => $authkey,
"r" => $read ? 1 : 0,
"w" => $write ? 1 : 0,
"ttl" => $ttl
));
}
function _sign($message) {
/** Calculate a signature by secret key and message. **/
return strtr( base64_encode(hash_hmac(
'sha256',
utf8_encode($message),
utf8_encode($this->secret_key),
true
)), '+/', '-_' );
}
function _auth($query) {
/** Issue an authenticated request.**/
if (!array_key_exists( 'timestamp', $query )) {
$query['timestamp'] = time();
}
## Global Grant?
if ((array_key_exists('auth',$query)) && !$query['auth']) {
unset($query['auth']);
}
## Construct String to Sign
$params = array();
$sorted_keys = array_keys($query);
sort($sorted_keys);
foreach ($sorted_keys as $key) array_push(
$params,
$key . "=" . $query[$key]
);
$string_to_sign =
$this->subscribe_key . "\n" .
$this->publish_key . "\n" .
"grant" . "\n" .
implode( "&", $params );
$signature = $this->_sign($string_to_sign);
$url = (
"https://pubsub.pubnub.com/v1/auth/grant/sub-key/" .
$this->subscribe_key . "?" .
implode( "&", $params ) .
"&signature=" . $signature
);
$workspace_curl = curl_init();
curl_setopt( $workspace_curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $workspace_curl, CURLOPT_URL, $url );
$result = curl_exec($workspace_curl);
return $workspace_details =json_decode( $result, true );
}
}
?>
pam.php
可在此处找到完整文件:PubNub Access Manager (PAM) PHP Full Library for Granting and Revoking Access
-pnpres
{{1}}:PubNub Access Manager (PAM) PHP Full Library for Granting and Revoking Access
警告:PubNub开发者控制台也需要在状态通道上授予!您可以通过授予{{1}}频道名称后缀来设置在线状态访问。