- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力实现 oauth2 以保护将调用 REST API 的 Web 应用程序,并允许其他潜在客户访问相同的 rest API。我想使用基于角色的访问来控制从 API 返回的数据。
我将使用 Keycloak 作为授权服务器以及用户/组管理。
用例是
我试图了解/最佳实践我应该在哪里存储用户所属的组列表。 SPA 和/或 REST 服务可以检索和传递的是访问 token 还是 ID token ,必须使用访问 token 和 userinfo 端点从授权服务器检索该数据。似乎 keycloak 将 JWT 用于访问和 ID token ,并且角色/组可以包含在两者中。我阅读了混合的建议,即访问 token 不应由 REST 服务读取并且仅用于证明用户已通过身份验证,但后来我看到它用于传递用户组。
我的另一个问题是,如果我想允许自动客户端访问无法使用授权流程的 REST API,最好的做法是使用客户端流程并在 keycloak 中加入该客户端并提供客户端 clientId 和 secret 以便能够检索访问 token 使用它来对 REST 服务进行身份验证(Bearer 身份验证 header )
更新
我还有几个后续问题,希望能弄清楚。
至于 ID token ,我认为 ID token 只应由验证用户身份的应用程序 (SPA) 使用,并将获取有关用户的信息(用户名、电子邮件和其他一些信息)关于声明和用户批准权限。可能是为了在应用程序中显示这些东西。 ID token 不应(永远不会)发送到 REST API 以检索数据。
另一方面,访问 token 不应在应用程序 (SPA) 中读取,而应在 API 服务器(Bearer $AUTH_TOKEN
)的每个请求中使用,API 服务器验证 token ,然后检索用户的分组信息并返回允许的响应。
仍然不清楚的是,如果应用程序收到授权 token 并不意味着用户已通过身份验证。为什么我们需要 ID Token。
此外,如果访问 token 并不总是携带信息并且可能只是一个随机字符串,那么您如何知道用户的权限。我读到有两种类型的 token “标识符类型”和“自包含类型”。我猜测如果 token 是标识符类型,那么 REST 服务将必须向授权服务器发送请求以通过回顾 API 获取该信息(组/权限)。
找到两篇关于此的好文章:
https://darutk.medium.com/oauth-access-token-implementation-30c2e8b90ff0 .
https://darutk.medium.com/api-protection-by-id-token-3123481e96f2
最佳答案
您应该始终将授权信息放在您的访问 token 中,而不是 ID token 中。有关用户组的信息可以出现在 ID token 中,例如,如果您在客户端中需要它们 - 也许您想根据用户组等对某些信息进行颜色编码。
Another question that I have is that if I want to allow an automated client to access the REST API which won't be able to use authorization flow is it in the best practice to use client flow and on board that client in keycloak and provide the client clientId and secret to be able to retrieve access token use it to authenticate to the REST service (Bearer authentication header)
正如 Jan 指出的那样,客户端凭证流正是为此目的而创建的 - 这样后端就可以相互通信。这是一种对客户端进行身份验证的方法。
What is still not clear is that if an application received an authorization token doesn't that mean the user is authenticated. Why do we need ID Token.
正如您所写的那样 - 访问 token 适用于 API,ID token 适用于客户端。当然,当您的客户端获得访问 token 时,这意味着用户已通过身份验证,但许多客户端希望获得有关已通过身份验证的用户的其他信息,因此他们可以例如显示您的个人资料图像、您的用户名、知道您的电子邮件等。因此 ID token - ID token 为您提供有关经过身份验证的用户的信息,不仅证明他们已通过身份验证。如果您只需要证明用户已通过身份验证,那么访问 token 就足够了。
Also, if access token does not always carry information and could be just a random string then how would you know user's permissions. I was reading that there are two types of tokens “identifier type” and “self-contained type”. I am guessing that if the token is an identifier type then REST Service will have to send a request to the authorization server to get that information (groups/permissions) via retrospect api.
确切地说,如果您使用不透明的字符串作为访问 token ,那么 API 将必须对授权服务器执行内省(introspection)流程(RFC 7662 中定义的标准)以验证 token 并获取关联的授权信息(例如用户组等)。如果您担心您的服务和授权服务器之间的流量很大,您可以查看一个名为 Phantom Token flow 的模式。它利用 API 网关及其缓存来执行内省(introspection)而不是服务本身。我建议使用这种方法,特别是因为您说过您将有 3d 方客户端访问您的 API。最好不要与 3d 方集成商共享 JWT 访问 token 。
另请参阅这篇关于 API Security Best Practices 的文章,它可能会更清楚地说明这些东西。
关于oauth-2.0 - 使用 OAuth 访问 SPA 和 REST API 时,RBAC 的用户组成员身份应该存储在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65961259/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!