2014-09-25 64 views
1

有基本上是兩個問題,我想解決:初始化到服務器Python的插座服務器通過使用客戶端做驗證令牌

  • 服務器端連接時

    1. 客戶端發送的查詢字符串在握手中驗證用戶令牌(不是在連接建立之後,然後驗證包含令牌的流消息)並相應地設置用戶會話。

    我讀了文章(https://auth0.com/blog/2014/01/15/auth-with-socket-io/)談到有關此過程中實現的NodeJS,只是想知道同樣的功能可以通過使用python來實現。 (目前我正在做一些關於扭曲的研究,但還沒有發現任何類似的東西)

    PS:猜測它有助於演示用例。用戶可以通過正常的http登錄到你的服務器,然後服務器將向他/她發出一個有效的accessToken。那麼這個用戶可能需要與服務器(或其他服務器)建立套接字連接,然後服務器需要在建立套接字連接之前找出用戶是誰並驗證。

  • 回答

    1

    查詢字符串是HTTP URL的一部分。

    如果您正在構建一個TCP套接字服務器而不是HTTP服務器,那麼您不會獲得URL或標頭,或其他任何帶外。*您所獲得的只是一串數據。您需要爲您的數據提供適合令牌的協議。

    這意味着服務器無法「在建立套接字連接之前找出用戶是誰並驗證它」。它必須建立套接字連接,讀取第一條消息,解析它,驗證令牌,然後刪除或繼續連接。 (當然,你可以建立一個接受連接的前端服務器,驗證它們,然後遷移或代理它們到真實的後端服務器,但某人必須接受,讀取和解析。)

    請注意,這正是HTTP所做的 - 它在接受連接並讀取第一行數據之前不能看到查詢字符串。

    同時,您正在查看的示例似乎正在使用WebSockets。 WebSockets客戶端無法與套接字服務器進行通信(當然,除非在套接字服務器之上或其前面的代理服務器上構建WebSocket服務器)。


    *這不是相當如此。您可以將40個字節的選項填充到TCP標頭擴展中。但是當你說他們說的是「套接字服務器」時,你不得不低於人們通常談論的水平 - 而且很有可能它不會通過互聯網。此外,TCP 確實有有一個「帶外」數據的概念,但在這裏並不相關;您仍然必須接受連接並從中讀取以獲取OOB數據。

    +0

    感謝您在這裏解決關鍵問題,直到現在我還沒有意識到WebSocket和Socket之間的區別。因此,對於這種用例,除了在建立套接字之後進行用戶令牌認證之外,還有其他方式通過套接字通信來認證用戶嗎? – Yang 2014-09-25 22:08:55

    +0

    @楊:理論上你可以嘗試基於來自同一個源地址進行身份驗證......但我認爲你鏈接的文章解釋了爲什麼這是一個壞主意。你也可以在UDP之上構建你自己的類TCP流,並將令牌部分作爲流連接協商的一部分(例如參見SIP,WebRTC,RTMFP等),但這對於一個漂亮的工作來說是相當大的工作量如果你的目標只是「我想要的是TCP所做的,除非我想避免沒有令牌的連接建立的成本」。你真的想在這裏解決什麼真正的問題? – abarnert 2014-09-25 22:54:51

    +0

    我試圖編寫一個與主服務器分開的遊戲服務器(稱之爲認證服務器或其他),因爲用戶登錄MS並且MS會存儲會話(在某些緩存中像redis)並返回用戶acessToken。然後,當用戶實際連接到遊戲服務器時,我希望使用與此遊戲服務器的身份驗證機制相同的標記來驗證用戶並知道他/她是誰。 – Yang 2014-09-25 23:28:13

    相關問題