2015-11-17 37 views
1

與推工作,簽名無效的問題以下錯誤:的Android推無效簽名 - 客戶端

Invalid signature: Expected HMAC SHA256 hex digest of socketID:channel, but got hash. 

這裏是我的代碼:

public static PusherOptions pusherChannelAuthorise(){ 
     Log.v(TAG, "pusherChannelAuthorise"); 
     mMobileToken = Handler_Login.fetchmobile(); 
     PUSHER_MOBILETOKEN_MAP.put(PUSHER_MOBILETOKEN_LABEL, mMobileToken); 

     HttpAuthorizer authoriser = new HttpAuthorizer(url); 
     authoriser.setHeaders(PUSHER_MOBILETOKEN_MAP); 
     options = new PusherOptions().setAuthorizer(authoriser); 

     return options; 
    } 

    public static void connect(){ 
     Log.v(TAG, "connect" + "::CONNECTED::"); 
     PusherOptions presenceChannelOptions = pusherChannelAuthorise(); 
     presenceChannelConnected = true; 
     pusher = new Pusher(pusherHash, presenceChannelOptions); 
     pusher.connect(new ConnectionEventListener() { 
      @Override 
      public void onConnectionStateChange(ConnectionStateChange change) { 
       socketId = pusher.getConnection().getSocketId(); 
       Log.v(TAG, "The socketId is: " + socketId); 
      } 

      @Override 
      public void onError(String message, String code, Exception e) { 
       Log.v(TAG, "There was a problem connecting!"); 
      } 
     }, ConnectionState.CONNECTED); 
     presencechannel = pusher.subscribePresence(PUSHER_PUBLIC_CHANNEL_NAME, listener); 
     String myUuid = Handler_Login.getMyUuid(); 
     privatechannel = pusher.subscribePrivate(DOCSYNC_CHANNEL + myUuid, docSyncListener); 
     privatechannel.bind("client-init", docSyncListener = new PrivateChannelEventListener() { 
      @Override 
      public void onEvent(String channelName, String eventName, String data) { 
       Log.v(TAG, "Private Test onEvent: " + channelName + " " + eventName + " " + data); 
      } 

      @Override 
      public void onSubscriptionSucceeded(String channelName) { 
       Log.v(TAG, "Private Channel onSubscriptionSucceeded: " + channelName); 
      } 

      @Override 
      public void onAuthenticationFailure(String message, Exception e) { 
       Log.v(TAG, "Private Channel onAuthenticationFailure: " + message + ":::" + e); 
      } 
     }); 
    } 

我在做什麼錯?我是否必須在授權人的標題中設置其他參數? @leggetter

對存在通道的身份驗證可以正常工作,但私鑰失敗。

編輯: 服務器代碼(PHP,Laravel):

public function postMobilePusher(Request $request) 
    { 
     if (null !== $request->header('mobileToken')) { 

      $currentUser = User::where('mobileToken', '=', $request->header('mobileToken'))->first(); 

      if (null !== $currentUser) { 

       define('APP_ID', ID); 
       define('APP_KEY', KEY); 
       define('APP_SECRET', SECRET); 

       $pusher = new Pusher(APP_KEY, APP_SECRET, APP_ID); 

       $socket_id = $request->get('socket_id'); 
       $channel_name = $request->get('channel_name'); 

       $user_id = $currentUser->id; 

       $user_info = [ 
        'firstName' => $currentUser->firstName 
        ]; 

       return $auth = $pusher->presence_auth($channel_name, $socket_id, $user_id, $user_info); 

      } 

     } 

     return abort(403, 'Unauthorized action.'); 

    } 
+0

服務器端代碼正在創建身份驗證簽名。代碼是什麼樣的? – leggetter

+0

添加到我的問題。該代碼處理這兩個請求,我是否需要添加一個函數來刪除$ user_info解析? – hipkiss

回答

1

更新服務器端代碼中使用socket_auth私人渠道和presence_auth的存在渠道:

public function postMobilePusher(Request $request) 
{ 
    if (null !== $request->header('mobileToken')) { 

     $currentUser = User::where('mobileToken', '=', $request->header('mobileToken'))->first(); 

     if (null !== $currentUser) { 

      define('APP_ID', ID); 
      define('APP_KEY', KEY); 
      define('APP_SECRET', SECRET); 

      $pusher = new Pusher(APP_KEY, APP_SECRET, APP_ID); 

      $socket_id = $request->get('socket_id'); 
      $channel_name = $request->get('channel_name'); 

      $auth = null; 
      if(starts_with($channel_name, 'private-')) { 
       // TODO: check user has permission to access channel 
       $auth = $pusher->socket_auth($channel_name, $socket_id); 
      } 
      else { 
       // presence 
       // TODO: check user has permission to access channel 
       $user_id = $currentUser->id; 

       $user_info = [ 
       'firstName' => $currentUser->firstName 
       ]; 

       $auth = $pusher->presence_auth($channel_name, $socket_id, $user_id, $user_info); 
      } 



     } 

    } 

    return abort(403, 'Unauthorized action.'); 

} 
+0

我仍然得到相同的錯誤。 – hipkiss

+0

您能否提供來自您的服務器代碼的調試輸出?有關調試細節,請參閱PHP Pusher README。 – leggetter

+0

修正了:)。謝謝@leggetter。重新啓動服務器並將PusherOptions更改爲setEncrypted(true);修復了這個問題。 – hipkiss