我們想爲我們的websockets使用django頻道,但我們也需要進行身份驗證。我們有一個運行django-rest-framework的rest api,在那裏我們使用token來驗證用戶,但是相同的功能似乎並沒有被構建到django-channels中。你如何使用django頻道的身份驗證驗證websocket?
4
A
回答
5
你可以找到這個問題的GitHub的所有信息: https://github.com/django/channels/issues/510#issuecomment-288677354
我將在這裏總結討論。
拷貝混入到您的項目: https://gist.github.com/leonardoo/9574251b3c7eefccd84fc38905110ce4
應用於裝飾,以
ws_connect
令牌通過較早的認證請求獲得在應用到/auth-token
視圖Django的REST的框架。我們使用查詢字符串將令牌發送回django渠道。如果你不使用django-rest-framework,你可以用你自己的方式使用查詢字符串。閱讀mixin如何獲得它。
- 在使用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分享他混入。
1
我相信在查詢字符串中發送令牌可以在HTTPS協議內暴露令牌。來左右我已經使用下列步驟等問題:
創建它創建臨時會話令牌基於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})
使用此
session_key
查詢參數通道參數
我知道有一個額外的API調用,但我相信它比在URL字符串中發送令牌更安全。
相關問題
- 1. 強制Django頻道Websocket身份驗證
- 2. WebSocket身份驗證
- 3. Django - 身份驗證
- 4. 如何進行websocket身份驗證?
- 5. Django用戶身份驗證
- 6. 使用FSharp.Data.Http驗證身份驗證
- 7. 使用Django身份驗證的SAML
- 8. Django社交身份驗證GitHub身份驗證
- 9. django身份驗證後端
- 10. Django身份驗證錯誤
- 11. Django,cordova和身份驗證
- 12. 身份驗證和Django 1.5
- 13. Django-Ldap-身份驗證
- 14. Django。身份驗證後端
- 15. Django身份驗證問題
- 16. Django Openstack身份驗證
- 17. Phonegap和Django身份驗證
- 18. django和backbone.js身份驗證
- 19. 未使用表單身份驗證的身份驗證
- 20. 使用PHP身份驗證的HTTP身份驗證
- 21. Sitecore的身份驗證使用API身份驗證/登錄
- 22. 使用Windows身份驗證的簡單身份驗證代理
- 23. 使用pymongo身份驗證時的身份驗證錯誤
- 24. websocket客戶端的身份驗證?
- 25. 使用AD作爲Django身份驗證
- 26. Solr身份驗證(使用Django Haystack)
- 27. 無法使用Django身份驗證
- 28. Webapi身份驗證,僅使用客戶端身份驗證
- 29. 使用asp.net身份驗證與自定義身份驗證
- 30. Websocket客戶端身份驗證
get_group函數在做什麼?你可以展示你的模型樣本,如果這將elp。謝謝 – Ycon
在這裏,我做了更完整的例子。這只是一些基本的字符串操作。 – ThaJay
我一直在這裏一段時間,對於我的生活我無法得到它的工作。你有這個成功嗎? – ergusto