如何在使用JS时隐藏pubnub键

时间:2014-01-12 08:19:33

标签: javascript php mysql publish-subscribe pubnub

我在pubnub打开了一张票,并且还读到了:https://help.pubnub.com/entries/22251291-Can-I-Hide-my-Application-Keys-

但是我仍然无法理解如何阻止用户看到我的密钥,因为即使在混淆之后它仍然在客户端。

我想要做的是我在这篇文章中读到的内容:PubNub publish message between two Private Channels

  1. 为每个用户创建公共频道和私有频道
  2. 隐藏用户的密钥
  3. 我不确定如何使用用户无法看到的自定义键创建私人频道。


    编辑: 我能够理解auth_key的流程,但无法找到JS crypto lib的php等效性来授予权限。关于如何在PHP中实现它的任何想法?

2 个答案:

答案 0 :(得分:6)

您无法隐藏传输到客户端并可在JavaScript中访问的密钥。

但是,您可以通过使用auth_key以及发布和订阅密钥来限制谁可以读取和写入频道。 PubNub最近发布了PubNub Access Manager以启用此功能。 auth_key将特定于每个用户。

  1. 用户auth_key将允许该用户读取和写入自己的私人频道。您需要设置权限,以便其他任何人都无法读取或写入此频道。
  2. 用户auth_key将授予他们读取和写入自己公共频道的权限。其他人可以阅读,但不能写入此频道。
  3. 可能会在另一个问题中询问有关如何执行此操作的详细信息。 PAM getting started guide应该是最好的起点。

答案 1 :(得分:4)

使用PubNub JS SDK隐藏您的API密钥

使用PubNub Access Manager,您不再需要担心将您的publish_keysubscribe_key隐藏在JavaScript代码或其他任何语言的源代码中!通常,您会认为隐藏密钥会成为阻止访问PubNub通道上的数据流的一种方法。但是,这不是必需的,而是使用最佳实践方法:以下是新方式管理访问的解决方案以及管理密钥的新方法

PubNub Access Manager示例JS / PHP Grant Revoke SDK

您可以在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

PubNub Access Manager (PAM) PHP Full Library for Granting and Revoking Access

包括PAM和初始化类访问

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 5ttl分钟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
));

授予GLOBAL Access(对所有用户)

排除ttl,您可以全局授予对所有人的访问权限。

0

Forever Grant Access

您可以通过将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(PubNub Access Manager)PHP类SDK 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开发者控制台测试链接:

警告:PubNub开发者控制台也需要在状态通道上授予!您可以通过授予{{1}}频道名称后缀来设置在线状态访问。

  

http://www.pubnub.com/console/?channel=my_channel&sub=sub-c-f95db694-6ff9-11e3-9291-02ee2ddab7fe&pub=pub-c-e132b7b4-0c2c-4d36-a828-1de1ea50d167&sec=sec-c-OWFkNWQ1NDctN2JiNy00NzJmLTk3Y2ItN2ExODZlYzkyNzY0