2017-04-13 75 views

回答

5

你可以找到這個問題的GitHub的所有信息: https://github.com/django/channels/issues/510#issuecomment-288677354

我將在這裏總結討論。

  1. 拷貝混入到您的項目: https://gist.github.com/leonardoo/9574251b3c7eefccd84fc38905110ce4

  2. 應用於裝飾,以ws_connect

令牌通過較早的認證請求獲得在應用到/auth-token視圖Django的REST的框架。我們使用查詢字符串將令牌發送回django渠道。如果你不使用django-rest-framework,你可以用你自己的方式使用查詢字符串。閱讀mixin如何獲得它。

  1. 在使用mixin並且正確的令牌與升級/連接請求一起使用後,消息將具有如下例所示的用戶。 正如你所看到的,我們在User模型上實現了has_permission(),所以它只能檢查它的實例。如果沒有令牌或令牌無效,則消息中將沒有用戶。
 

    # get_group, get_group_category and get_id are specific to the way we named 
    # things in our implementation but I've included them for completeness. 
    # We use the URL `wss://www.website.com/ws/app_1234?token=3a5s4er34srd32` 

    def get_group(message): 
     return message.content['path'].strip('/').replace('ws/', '', 1) 


    def get_group_category(group): 
     partition = group.rpartition('_') 

     if partition[0]: 
      return partition[0] 
     else: 
      return group 


    def get_id(group): 
     return group.rpartition('_')[2] 


    def accept_connection(message, group): 
     message.reply_channel.send({'accept': True}) 
     Group(group).add(message.reply_channel) 


    # here in connect_app we access the user on message 
    # that has been set by @rest_token_user 

    def connect_app(message, group): 
     if message.user.has_permission(pk=get_id(group)): 
      accept_connection(message, group) 


    @rest_token_user 
    def ws_connect(message): 
     group = get_group(message) # returns 'app_1234' 
     category = get_group_category(group) # returns 'app' 

     if category == 'app': 
      connect_app(message, group) 


    # sends the message contents to everyone in the same group 

    def ws_message(message): 
     Group(get_group(message)).send({'text': message.content['text']}) 


    # removes this connection from its group. In this setup a 
    # connection wil only ever have one group. 

    def ws_disconnect(message): 
     Group(get_group(message)).discard(message.reply_channel) 


感謝GitHub的用戶leonardoo分享他混入。

+0

get_group函數在做什麼?你可以展示你的模型樣本,如果這將elp。謝謝 – Ycon

+0

在這裏,我做了更完整的例子。這只是一些基本的字符串操作。 – ThaJay

+0

我一直在這裏一段時間,對於我的生活我無法得到它的工作。你有這個成功嗎? – ergusto

1

我相信在查詢字符串中發送令牌可以在HTTPS協議內暴露令牌。來左右我已經使用下列步驟等問題:

  1. 創建它創建臨時會話令牌基於REST API端點和應對回本session_key(本次會議設置在2分鐘內到期)

    login(request,request.user)#Create session with this user 
    request.session.set_expiry(2*60)#Make this session expire in 2Mins 
    return Response({'session_key':request.session.session_key}) 
    
  2. 使用此session_key查詢參數通道參數

我知道有一個額外的API調用,但我相信它比在URL字符串中發送令牌更安全。