1

我环顾四周,但似乎找不到规范的答案。我正在尝试遵循最佳实践。也许我想错了。

我将我的 API 用户视为两种不同的类型:开发人员和最终用户,在不同的应用程序中使用不同的 django 模型。

开发人员将为 API 构建客户端,并且无需用户登录即可访问 API 的某些资源。为了限制他们的访问权限,我会要求他们注册并作为交换给他们一个 API 密钥。我们也可以这样说,使用 Angular 和 iOS 应用程序构建网站前端。一旦这些开发人员构建了他们的 API 客户端,我网站上已经创建了用户帐户的用户将使用开发人员创建的 API 客户端。在这些客户的请求中,我希望有一个开发人员姓名、api_key 以及用户名/密码(摘要,如果它是我们自己的受信任客户端和第三方开发人员的 oauth 令牌)。这将需要检查 1) 允许开发人员通过检查其 APIKey 来使用 API,以及 2) 对最终用户进行身份验证。这可能在美味派中吗?

我会以错误的方式解决这个问题吗?我将如何进行双重身份验证?

4

2 回答 2

1

我们使用这个确切的方案运行一个生产站点。当然,您必须自己进行调整。但总体思路是好的。您也可以使用一些 OAuth,但我们发现它不值得。对于大多数情况,OAuth 太复杂了。

我将大致解释我们的工作。

这是应用程序/开发人员部分:

  1. 我们识别“应用程序”(iOS、Android、BB、网站)。每个应用程序都有一个 ApiClient 实例模型。ApiClient 具有三个属性:名称、公钥和私钥。

  2. 我们通过安全通道与 ApiClient 所有者(应用程序)交换公钥和私钥。

  3. 应用程序必须发送指示公钥和使用私钥生成的签名(使用 hmac)的每个请求。

  4. 每次我们收到请求时,我们都会从请求中获取公钥,在数据库中查找它,查看它也属于哪个 App(名称)并检查签名。如果一切正常,则请求已完成。

对于用户认证部分:

  1. 为了验证用户身份,我们使用其他模型 ApiKey(由美味派提供)。每个用户都有一个 ApiKey。该模型存储一个唯一的(我们可以说是随机的)字符串。当用户访问应用程序时,他/她会登录到您的 API。该应用程序应发出与此类似的请求:

    POST /api/v1/login/ { '用户名': 'XXX', '密码': 'XXX' }

    (请注意,它总是需要通过之前的公钥/私钥认证)

  2. 如果用户提供了正确的凭据,我们将返回一个 ApiKey 唯一密钥。

  3. 应用程序以该用户的行为发出的每个后续请求都必须包含密钥。这就是您确定哪个用户正在尝试执行每个操作的方式。

最后一部分的一个例子:

  1. 用户 Jon 登录 iOS 应用程序。(使用常规用户名和密码)
  2. 应用程序发送请求:

    POST /api/v1/login/ { '用户名': 'jon', '密码': 'snow' }

  3. 我们有一个loginAPI 方法。我们检查用户是否存在以及通过是否正常。假设没问题。

  4. 我们发送了 ApiKey 信息:

    200 OK {'用户名':'乔恩','密钥':'$ 123 $'}

  5. 该应用程序已对用户进行身份验证。它需要使用这些凭据。

  6. 用户尝试在您的应用中做某事。假设他试图从您的应用程序中获取日期时间。该应用程序将发出此请求:

    获取 /api/v1/日期/

    授权:ApiKey jon:$123$

而已。这不是超级安全。ApiKey 不会失效。但那是因为我们创建了自己的内部应用程序。值得注意的是,我们从 Tastypie 那里借了一些东西。看看这个:http ://django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication

于 2013-05-14T03:26:02.760 回答
0

这是相切的,但您可能需要查看drf-keypair-permissions

这是一个 Django 模块,它使用非对称公钥/私钥对使用预共享密钥对 HTTP 请求进行签名和验证。它可以将每个公钥与用户配对,因此授权兼作登录,并且可以扩展以管理 API 限制。

它支持一些算法,包括 RSA-SHA 和椭圆曲线,并且可以在管理区域管理密钥。 在此处输入图像描述

它使用IETC Cavage-12 草案标准来处理授权签名

于 2020-09-17T10:51:24.013 回答