【发布时间】:2020-02-25 17:49:13
【问题描述】:
我想设计一个 GraphQL API。此 API 将被某些浏览器应用程序使用,也可直接用于希望创建自己的脚本/生成报告等的人。该 API 将依赖于支持 Oauth Openid Connect (okta) 的第三方应用程序来获取用户和角色管理。它将用 Django 编写。
因为 JWT 是保护 GraphQL API 的推荐方法,而且 OIDC 使用 JWT 令牌。我想到了一个简单的方法,API 会简单地接受 okta 发布的 JWT 令牌。这可行,但是当 API 要求 okta 验证令牌时,我看到很多延迟(这种延迟在生产中可能更小,因为我正在测试免费试用 auth0 而不是生产 okta)。所以我认为也许我的 API 应该发布自己的 JWT 令牌。我可以在这里想到三个策略:
- 保持原样 - 仅使用 OIDC JWT。
- 引入登录突变或登录 REST 端点,它将接受上述 OIDC 并发出可用于所有其他操作的 JWT。
- 同上,但也允许直接使用 okta 的 JWT(我不确定是否可以使用 Django 的身份验证系统来实现它,这样如果识别到令牌,则不会调用 OIDC)。
这三种方法中哪一种是保护我的 API 的正确方法(并且可能是 OIDC 设计者的意图)?
【问题讨论】:
-
比较 Auth0(试用版)和 Okta 的性能似乎有点不对劲?一般来说,我建议只使用 OIDC。使用您自己的或任何专有的身份验证是供应商锁定,可能会阻止与其他人的集成。
-
我只使用 OIDC。我不使用任何特定于 okta 或 auth0 的功能。只有 OIDC 协议,它们都实现了。
-
JWT 令牌不需要由 Okta 验证(通常由 IdP)。您只需要使用公钥(可以在发现响应中找到 jwks url),然后您就可以在没有任何 IdP 调用的情况下验证签名。恕我直言,您可以轻松获得 2-4k 验证/秒。
-
谢谢。这意味着我需要仔细研究 django 插件是如何处理它的。可能是配置错误,下载后没有缓存密钥。或者,它可能会尝试检索每个呼叫的用户数据。我相信,这条评论可能是我正在寻找的答案。
-
好的。现在我看到 mozilla_django_oidc 与配置的“jwks-endpoint”一起使用时会重新下载每次检查的密钥。此后,即使用户已经在数据库中,它也将始终获取用户信息。这是延迟的根源。如果您不介意,请写下您给我的信息作为答案,以便我接受。
标签: security oauth jwt graphql openid-connect