Я открыл билет в pubnub, а также прочитал: https://help.pubnub.com/entries/22251291-Can-I-Hide-my-Application-Keys-
Но я все еще не могу понять, как я могу остановить пользователя от просмотра моих ключей, поскольку он все еще находится на стороне клиента даже после обфускации.
То, что я хочу сделать, это то, что я прочитал в этом сообщении: PubNub публикует сообщение между двумя частными каналами
Я не уверен, как создать частный канал с пользовательскими ключами, которые пользователь не может видеть.
EDIT: я смог понять поток auth_key, но не могу найти эквивалентность php для JS crypto lib для предоставления разрешения. любая идея о том, как реализовать его в PHP?
С PubNub Access Manager вам больше не нужно беспокоиться о том, чтобы скрывать ваши publish_key
и subscribe_key
в исходном коде на JavaScript или на любом другом языке! Как правило, вы считаете, что скрытие ваших ключей становится средством предотвращения доступа к потокам данных на ваших каналах PubNub. Однако это необязательно, и вместо этого существует метод наилучшей практики: Ниже приведено ваше решение для нового способа управления доступом и нового способа управления вашими ключами .
Вы можете выдавать доступ к предоставлению доступа для каждого пользователя grant()
и revoke()
в реальном времени в глобальной сети реального времени PubNub. Различные уровни безопасности в сети PubNub с использованием схемы разрешений гранта / отзыва (белого списка), где первый грант, найденный в иерархии, предоставляет доступ для чтения / записи. Разрешения оцениваются как для публикации, так и для подписки на основе этой иерархии. Наш pam.php
PubNub Access Manager PHP Class, наконец, готов к работе! Вы можете начать, увидев приведенный ниже пример кода использования с полным охватом кода SDK. Вы можете найти весь исходный код через GitHub Gist Link:
PubNub Access Manager (PAM) Полная библиотека PHP для предоставления и отзыва доступа
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 ));
Вы можете предоставить доступ навсегда, установив параметр 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
Полный файл можно найти здесь: 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 Console требует гранта на канал присутствия! Вы можете установить доступ к присутствию, предоставив суффикс -pnpres
канала -pnpres
.
Вы не можете скрыть ключи, которые передаются клиенту и доступны в JavaScript.
Тем не менее, вы можете ограничить, кто может читать и писать на каналы, используя auth_key
вместе с вашими ключами публикации и подписки. PubNub недавно выпустил PubNub Access Manager, чтобы включить это. Функция auth_key
будет специфичной для каждого пользователя.
auth_key
позволят этому пользователю читать и писать на свой собственный частный канал. Вам нужно будет установить разрешения, чтобы никто не мог читать или писать на этот канал. auth_key
предоставят им право на чтение и запись на свой собственный общедоступный канал. Другие могут читать, но не могут писать на этот канал. Подробности о том, как это сделать, следует, вероятно, задать по другому вопросу. Руководство по началу работы с PAM должно стать лучшим местом для начала.