【问题标题】:Django security and authenticationDjango 安全和身份验证
【发布时间】:2016-05-21 02:31:12
【问题描述】:

我有几个关于令牌和用户名/密码对的问题。

  1. 我设置了一个 django rest API,一旦用户注册,它就会使用令牌。但是我不知道如何安全地将令牌退还给用户?目前我使用:

    response_data = UserSerializer(instance=new_user).data
    response_data['token'] = token.key
    return Response(response_data, status=status.HTTP_201_CREATED)
    

但是通过这种方式我可以在浏览器中清楚地看到我的响应正文中的所有详细信息吗?甚至我的密码。我应该如何将它返回给客户?

  1. 注册用户时,我这样做:

    序列化 = UserSerializer(data=request.DATA) 如果序列化.is_valid(): 打印(序列化.validated_data) new_user = get_user_model().objects.create(**serialized.validated_data) token = Token.objects.create(user=new_user)

这会正确创建我的用户吗?密码会被散列吗?

谢谢

附:这是整个方法:

@api_view(['POST'])
def register_user(request):
    print (request)
    serialized = UserSerializer(data=request.DATA)
    if serialized.is_valid():
        print(serialized.validated_data)
        new_user = get_user_model().objects.create(**serialized.validated_data)
        token = Token.objects.create(user=new_user)

        response_data = UserSerializer(instance=new_user).data
        response_data['token'] = token.key
        return Response(response_data, status=status.HTTP_201_CREATED)
    else:
        return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

    标签: django


    【解决方案1】:

    如果这适用于您的用例,我将通过设置 cookie 来处理 #1。 Relevant SO Post: How to set cookie in Django view and then render template.

    对于#2,我相信你应该使用create_user 而不是createCheck the Django docs here. 一种快速检查密码是否正确散列的方法是打开一个 shell,获取一个用户对象,然后查看密码的样子:

    >>u = User.objects.get(id=1)
    >>u.password
    u'pbkdf2_sha256$12000$e30c2ea7a76f83b7c1a975ddc24286b675e714ebbbc72ccd5f0401730231ab57'
    

    您可以轻松判断密码是否经过哈希处理。

    【讨论】:

    • 好吧,我将其发送到 Android 应用程序...我无法使用 cookie
    • 你对 2 是正确的 -> 使用 create() 不会散列密码,而使用 create_user() 会这样做
    • 您编写的视图序列化您的用户数据,将token 附加到它并返回它。如果您想保留某些数据(如散列密码),您可能希望在您的response_data 中删除(或根本不包括它)。在不确切知道您希望应用程序如何工作的情况下,很难给出更具体的答案。渲染您返回的数据可能取决于您的 android 应用程序逻辑,而不是 Django。
    • 不不,我不想渲染它。我只想以安全的方式接收它。基本上我想知道我是否在服务器上设置了 SSL,我不需要做任何其他事情来发送数据吗?因为 SSL 将加密整个正文,因此即使有人拦截了我的响应,他/她也无法看到用户的用户名/密码/令牌?
    • 只要您通过 HTTPS 提供数据并正确配置了证书和 SSL 设置,据我了解,您的数据在从服务器传输到应用程序的过程中将是安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2019-01-20
    相关资源
    最近更新 更多