如何在 Django 中安全地存储 OAuth2 访问和刷新令牌

时间:2021-01-19 13:15:55

标签: django django-rest-framework oauth-2.0 azure-ad-graph-api azure-authentication

我正在尝试为我们的 Django 应用程序实现 Azure AD OAuth 身份验证,我将使用 Azure AD 作为 OAuth 提供程序来实现。所以现在我想知道我们可以如何安全地将 OAuth 访问/刷新令牌存储在我们从 Azure AD 或任何 OAuth 提供程序接收的数据库中。

我想将用户的访问令牌存储在数据库中,因为我们的网络应用程序中有一项功能,用户可以在其中发送带有电子邮件 ID 的电子邮件,并且我们有一个每半小时运行一次的定期作业,它会获取用户的邮件基于特定的主题行。我们将在 Microsoft Graph API 的帮助下完成此操作,为了调用 Microsoft Graph API,Web 应用程序应将用户的访问令牌存储在数据库中。但我担心的是,一旦我们收到访问和刷新令牌,一旦我们将其存储在数据库中,任何人都不应该访问它。那么我们可以如何安全地或以加密方式将 OAuth2 访问令牌存储在 Django 中。

我浏览了一些关于这个问题的文章、QnA 和论坛,但也想听听 Django 社区的意见。

提前致谢。

1 个答案:

答案 0 :(得分:0)

让我们从按图(https://graph.microsoft.com/v1.0/users/{userId}/sendMail)发送电子邮件开始。我已经做了一些测试,这是详细信息。

  1. 当我使用凭证流生成访问令牌时,我无法使用它发送带有“ErrorAccessDenied”之类错误的电子邮件,这意味着我们无法生成可用于许多人的令牌帐户。

  2. 当我使用身份验证代码流生成访问令牌时,当我使用用于在 api url 中生成令牌的 ID 设置不同的用户 ID 时,我无法使用它来发送电子邮件。在这种情况下,我也收到与上述相同的错误。

  3. 当我使用 ropc flow 并且我可以用它成功发送电子邮件时,这意味着我会只有在我使用正确的用户 ID 和令牌时才能成功发送电子邮件

发送邮件失败的错误信息:

{
    "error":{
    "code": "ErrorAccessDenied",
         "message": "Access is denied. Check credentials and try again."
    }
}

并且根据测试结果,我认为如果您决定将令牌存储到数据库中,您可以将其与用户 ID 内联保存,因此当您的定期作业执行时,您的程序可以查询正确的令牌,这可以先解码看是否过期,然后用它来发送邮件。

如果我在某些地方误解,请指出我的错误,谢谢。