Auth0 中自定义 API 的优势是啥?

Posted

技术标签:

【中文标题】Auth0 中自定义 API 的优势是啥?【英文标题】:What is the advantage of a custom API in Auth0?Auth0 中自定义 API 的优势是什么? 【发布时间】:2019-10-31 18:11:43 【问题描述】:

问题

我在理解一些关于 auth0 的基本知识时遇到了问题,可能有人可以帮助我。

在教程SPA + API 中,TDLR 的第一行是这样的:

SPA 和 API 都必须在 Auth0 Dashboard 中配置

我不明白为什么我需要在 Auth0 上配置 API。我的代码似乎可以工作,所以任何人都可以帮助我了解我是否做错了什么,或者如果我在仪表板中实际添加自定义 API 有什么好处?

设置

SPA(反应) Auth0 REST API (ktor)

我做什么

在 Auth0 上创建了一个 SPA 通过 Auth0 登录我的 SPA 以获取 JWT(谷歌令牌) 在我对 REST API 的调用中将 JWT 作为身份验证承载发送 REST API 使用 Auth0 url mydomain.eu.auth0.com/.well-known/jwks.json 通过 JWK 提供程序验证 JWT 令牌。 身份验证似乎有效

【问题讨论】:

【参考方案1】:

很好的问题,我假设您的身份验证请求现在包含代表您的自定义 API(Rest API)的观众参数。在 oauth2 术语中,它被称为资源服务器。每个资源服务器都可以拥有许多权限,您在启动身份验证请求时将这些权限包含在范围内。让我们退后一步,谈谈令牌格式。 Auth0 以两种格式颁发令牌:

不透明字符串:不使用自定义 API 时 JSON Web 令牌 (JWT):使用自定义 API 时

https://auth0.com/docs/tokens/reference/access-token/access-token-formats#how-does-all-this-affect-the-token-format-

如上链接所述,令牌格式取决于受众(自定义 API)参数。因此,当身份验证请求包含受众时,auth0 会发出具有所有必要权限的 JWT 令牌。然后,您需要在将资源返回给前端客户端之前验证 API 服务器中的 JWT 令牌。

为什么需要在 auth0 中创建自定义 API 并定义权限应该是有道理的。如果您没有在 auth0 中创建自定义 API,则无法知道您在令牌中需要什么样的权限,这将产生错误(指定的受众无效)

【讨论】:

当我做我的 WebAuth 对象时,我添加了一个以 mydomain/userinfo 作为值的“受众”键。范围是“openid 电子邮件配置文件”。我收到一个访问令牌和 id 令牌,使用访问令牌我可以获得用户个人资料。所以我仍然无法理解如果我要添加自定义 api 我会做什么。您的链接提到此访问令牌采用不透明格式。当我配置自定义 api 时,我会将 api 标识符添加为受众并接收 JWT 格式的令牌,对吗?我会用它把它发送到我的 REST api 并在那里检查吗?但我不明白为什么这会更好。 如果您提供 openid 作为范围,它应该自动添加 /userinfo 作为受众。或者,您可以提供 /userinfo 作为受众。访问令牌不是该阶段的 JWT 令牌。它是一个不透明的令牌,只能用于调用 /userinfo 端点。您不能使用此访问令牌来调用您的 Rest API 端点。现在,将您的自定义 API 标识符作为受众传递并比较令牌。您可以使用jwt.io 来解码令牌并检查令牌内容。 auth0.com/docs/api-auth/why-use-access-tokens-to-secure-apis 我在没有受众的情况下进行了授权,并将令牌与以 api 标识符作为受众的授权进行了比较。我看到访问令牌更长,并且具有我通过 auth0 中的用户角色添加的权限。我仍然不明白如何在我的应用程序中使用它。最后,我可以在 rest api 后端验证 jwt 并检查用户是否具有访问路由的正确角色。感谢您的帮助,我将尝试重新阅读文档... 简单地说,角色或权限可用于保护您的 API 端点并防止未经授权的请求。 auth0.com/docs/scopes/current#ways-to-use-scopes 示例:auth0.com/docs/quickstart/backend/nodejs 所以让我总结一下:我使用我的自定义 api 的授权来获取用户的范围/权限。之后,我知道我可以访问哪些范围作为我的令牌的一部分。现在我用这个令牌调用我的rest api,并通过检查用户是否拥有这条路线的权限/范围来保护每条路线?像“GET posts”这样的路由可能需要“read:posts”。但这几乎与我只是为每个用户添加一个角色并在后端比较用户是否可以根据他的角色访问特定路线一样 - 对吗?:)

以上是关于Auth0 中自定义 API 的优势是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 auth0 自定义 api 发出用户名密码请求,出现错误“不支持的授权类型:密码”错误

ASP.NET WEB API 中自定义对象的序列化 [重复]

当 API 中未发送必填字段值时,如何在 swagger 中自定义错误消息?

如何在 asp.net web api 2 中自定义对我自己的一组表的身份验证?

Spring Security:未调用自定义 UserDetailsS​​ervice(使用 Auth0 身份验证)

java中自定义异常类