как скрыть ключи pubnub при использовании JS

Я открыл билет в pubnub, а также прочитал: https://help.pubnub.com/entries/22251291-Can-I-Hide-my-Application-Keys-

Но я все еще не могу понять, как я могу остановить пользователя от просмотра моих ключей, поскольку он все еще находится на стороне клиента даже после обфускации.

То, что я хочу сделать, это то, что я прочитал в этом сообщении: PubNub публикует сообщение между двумя частными каналами

  1. Создайте общедоступный канал и частный канал для каждого пользователя
  2. Скрыть ключи от пользователя

Я не уверен, как создать частный канал с пользовательскими ключами, которые пользователь не может видеть.


EDIT: я смог понять поток auth_key, но не могу найти эквивалентность php для JS crypto lib для предоставления разрешения. любая идея о том, как реализовать его в PHP?

Solutions Collecting From Web of "как скрыть ключи pubnub при использовании JS"

Скрытие ваших ключей API с помощью PubNub JS SDK

С PubNub Access Manager вам больше не нужно беспокоиться о том, чтобы скрывать ваши publish_key и subscribe_key в исходном коде на JavaScript или на любом другом языке! Как правило, вы считаете, что скрытие ваших ключей становится средством предотвращения доступа к потокам данных на ваших каналах PubNub. Однако это необязательно, и вместо этого существует метод наилучшей практики: Ниже приведено ваше решение для нового способа управления доступом и нового способа управления вашими ключами .

PubNub Access Manager Пример JS / PHP Grate Revoke SDK

Вы можете выдавать доступ к предоставлению доступа для каждого пользователя grant() и revoke() в реальном времени в глобальной сети реального времени PubNub. Различные уровни безопасности в сети PubNub с использованием схемы разрешений гранта / отзыва (белого списка), где первый грант, найденный в иерархии, предоставляет доступ для чтения / записи. Разрешения оцениваются как для публикации, так и для подписки на основе этой иерархии. Наш pam.php PubNub Access Manager PHP Class, наконец, готов к работе! Вы можете начать, увидев приведенный ниже пример кода использования с полным охватом кода SDK. Вы можете найти весь исходный код через GitHub Gist Link:

PubNub Access Manager (PAM) Полная библиотека PHP для предоставления и отзыва доступа

PubNub Access Manager (PAM) Полная библиотека PHP для предоставления и отзыва доступа

Включить доступ класса PAM и инициализировать класс

 require('pam.php'); $manager = new access( "pub-c-e132b7b4-0c2c-4d36-a828-1de1ea50d167", "sub-c-f95db694-6ff9-11e3-9291-02ee2ddab7fe", "sec-c-OWFkNWQ1NDctN2JiNy00NzJmLTk3Y2ItN2ExODZlYzkyNzY0" ); 

Предоставить пользователю доступ

Предоставьте пользователю доступ с 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 )); 

Предоставление доступа к присутствию пользователей

Также предоставите доступ к каналу присутствия (требуется для PubNub Dev Console).

 print_r($manager->grant( "my_channel-pnpres", // CHANNEL "gZW5jb2RlZCBmaWx", // STRING (AUTH KEY) true, // READ true, // WRITE 5 // TTL in MINUTES )); 

Грант ГЛОБАЛЬНЫЙ доступ (для всех пользователей)

Исключить authkey и вы можете предоставить глобальный доступ для всех.

 print_r($manager->grant_global( "my_channel", // CHANNEL true, // READ true, // WRITE 5 // TTL in MINUTES )); 

Доступ к Forever Grant

Вы можете предоставить доступ навсегда, установив параметр 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 (PubNub Access Manager) PHP Class SDK pam.php

Полный файл можно найти здесь: PubNub Access Manager (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 ); } } ?> с <?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 для предоставления и отзыва доступа

PubNub Dev Консольная тестовая ссылка:

ПРЕДУПРЕЖДЕНИЕ: PubNub Dev Console требует гранта на канал присутствия! Вы можете установить доступ к присутствию, предоставив суффикс -pnpres канала -pnpres .

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

Вы не можете скрыть ключи, которые передаются клиенту и доступны в JavaScript.

Тем не менее, вы можете ограничить, кто может читать и писать на каналы, используя auth_key вместе с вашими ключами публикации и подписки. PubNub недавно выпустил PubNub Access Manager, чтобы включить это. Функция auth_key будет специфичной для каждого пользователя.

  1. Пользователи auth_key позволят этому пользователю читать и писать на свой собственный частный канал. Вам нужно будет установить разрешения, чтобы никто не мог читать или писать на этот канал.
  2. Пользователи auth_key предоставят им право на чтение и запись на свой собственный общедоступный канал. Другие могут читать, но не могут писать на этот канал.

Подробности о том, как это сделать, следует, вероятно, задать по другому вопросу. Руководство по началу работы с PAM должно стать лучшим местом для начала.