我正在编写一个聊天应用程序,注册用户可以在其中相互发送消息。
其中的一个组件是基于Django的消息微服务,该服务具有用于发送和接收消息的API。为简单起见,只有两个URL:
# List all messages in Thread "thread_id"
GET /threads/<int:thread_id>/messages/?user_id=123
# Send a message as user "user_id" to Thread "thread_id"
POST /threads/<int:thread_id>/messages/?user_id=123
此服务仅在内部可见,因此不可能欺骗user_id
。
授权基于user_id
,它作为查询参数传递给服务并按以下方式处理:
views.py
:
class MessagesViewClass(django.views.View):
def get(request, thread_id):
# If this user is not part of this thread
user_id = request.GET.get('user_id')
if this_user_not_part_of_this_thread(user_id, thread_id):
raise Some403Exception()
else:
process_response_normally()
现在,我正在通过查询参数进行验证。是否有更常规或规范的方式来处理这种类型的授权?
答案 0 :(得分:2)
由于只允许登录用户查看和接收消息,因此无需在查询参数中发送user_id。您可以使用request.user.id
来获取登录用户的用户ID。