对用户进行子类化以使用API​​密钥区分管理员和应用程序?

时间:2013-12-31 01:11:44

标签: python django oauth django-authentication django-rest-framework

这是我的第一个API,如果我做出任何错误的声明,请原谅/纠正我。

我有一个拥有API的应用。我只希望有一个有效API密钥的外部应用程序(移动客户端等)可以访问它,我认为django-rest-framework的TokenAuthentication是最适合它的。我还希望用户能够使用他们的用户名和用户登录。密码,我希望使用OAuth2Authentication。但我不希望使用TokenAuthentication的应用程序在数据库中拥有“用户”实例(因为它们不是传统意义上的用户)所以我正在考虑做这样的事情:

class Client(User):
    pass
  1. django-rest-framework说request.user将是User的一个实例。如果我使用客户端,我会遇到任何问题吗?
  2. 这是处理这种情况的标准方法吗?它对我来说感觉不对(主要是因为问题1)

1 个答案:

答案 0 :(得分:0)

对于移动客户端可以访问您的API,使用django-restframework的TokenAuthentication将正常工作。正如你已经确定的那样。您需要设计一个分发令牌的机制。如果您是动态执行此操作,则需要让您的API请求处理此问题。

移动客户端:(初始API请求)

  1. request / API / rabbit / 1 /
  2. (无代币)
  3. 服务器:401

    1. 测试令牌(失败)
    2. 'login please'通过HTTP 401响应。 (或其他一些自定义标题或响应信息)
    3. 你可以定义你的API如何实现这一点,大多数人使用http:  401 Unauthorized错误代码。我指出这一点,因为它显然是一个设计决定。

      移动客户端:(请求登录)

      1. 提示用户输入用户名和密码,并提出请求/ login /这可能是一个特殊的移动客户端登录,如/ mobile / login /,区别在于它成功登录时回复了一个令牌。
      2. 服务器:200

        1. 验证有效用户并分发令牌。 你可以写这个逻辑,或者你可以使用我推荐的'rest_framework.authtoken.views.obtain_auth_token'。请参阅rest-frameworks token authentication了解详情。听取有关https的警告。
        2. 移动客户端:(在http标头中重新请求包含令牌的API)

          1. 收到令牌
          2. 现在将头部的令牌重新发送到/ API / rabbit / 1 /的初始请求。
          3. 服务器:200

            1. 验证标头中的有效令牌并提供对API的访问权限。您将编写此代码。
            2. 最后:您需要设计一种策略来“延长”您的令牌,或锁定用户。

              另外:请务必将“rest_framework.authtoken”添加到您的INSTALLED_APPS中,并确保拨打manage.py syncdb

              除了:您没有特别使用TokenAuthentication(request.user,request.auth),您可以编写自己的代码来查看标头并查看是否设置了令牌。这对python Cookie lib来说相当容易。您仍在使用django-rest-framework的令牌管理功能。老实说,我认为配置'TokenAuthentication'身份验证后端的文档有点不完整。

              希望这有帮助!