【问题标题】:Spring oauth2 authorization flow - preapproval in appSpring oauth2 授权流程 - 应用程序中的预先批准
【发布时间】:2015-03-05 04:34:58
【问题描述】:

我们有一个服务器到服务器的通信,我们希望使用 oauth 来保护它,但授权需要是用户的。 (因为主服务器维护一个会话并执行一些不是弹簧角色检查的用户权限验证)。

起初我想到了 client_credencials,但我需要在 clientid 和用户之间执行一些映射。这种需要在服务器上进行隐藏登录才能初始化用户会话。 这也不是推荐的流程(如 spring ClientCredentialsTokenEndpointFilter 代码中所写)

所以我想我想尝试一种不同的方法,比如 authrization_code,但我不想在这里进行任何重定向。我想要这么简单的东西。

  1. 用户登录我们的应用程序(主服务器)
  2. 生成授权请求 - 例如创建 API 密钥或其他内容。
  3. 向用户显示授权码和状态
  4. 用户转到另一台服务器并将代码和状态放在某处(无关紧要)
  5. 其他服务器使用代码和状态来交换令牌。

我怎样才能做到这一点? 谢谢

史洛米

【问题讨论】:

  • 标准流程是:`1.用户转到其他服务器 2. 其他服务器生成授权请求并重定向到主服务器 3. 用户登录到主服务器 4. 用户被重定向回具有代码+状态的其他服务器 5. 其他服务器交换代码以获取令牌;您是否试图避免重定向 2. 而不是 4.?
  • 在 4 中没有重定向,用户打开另一个服务器应用程序并插入详细信息。避免重定向的原因很复杂,它是一种内部部署产品,它与 saas 产品相抗衡,在 saas 用户中由外部提供商进行身份验证,因此 3 方之间的重定向对我们来说更复杂。这就是为什么我认为一切都可以在 saas 端应用程序上完成,并且用户会将详细信息复制到本地产品中。
  • 仍然没有可靠的解决方案 - 即使使用 JWT 问题仍然存在 - 谁是用户?我们应该事先为集成创建它吗?

标签: spring api oauth-2.0 authorization


【解决方案1】:

您可以从您的服务器向远程服务器发送一个识别用户的 JWT,远程服务器可以将其用作“授权”以从您的服务器获取访问令牌。这称为 JWT 授权授予。规范(正在进行的工作)在这里:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-jwt-bearer-12 但已经有许多实现。下面是一个示例 JSON 对象,可以对其进行编码以生成 JWT 的 JWT 声明对象:

 {
  "iss":"https://jwt-idp.example.com",
  "sub":"mailto:mike@example.com",
  "aud":"https://jwt-rp.example.net",
  "nbf":1300815780,
  "exp":1300819380,
  "http://claims.example.com/member":true
 }

为了向 JWT 提供上例中显示的声明和标头作为访问令牌请求的一部分,例如,客户端可能会发出以下 HTTPS 请求(额外的换行符仅用于显示目的):

POST /token.oauth2 HTTP/1.1
Host: authz.example.net
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&assertion=eyJhbGciOiJFUzI1NiJ9.
eyJpc3Mi[...omitted for brevity...].
J9l-ZhwP[...omitted for brevity...]

当然双方的实现都需要支持这种授权类型,但是将它添加到现有的 OAuth 2.0 实现中应该太难了,因为它重用了大部分其他授权类型。

【讨论】:

  • 谢谢汉斯,实际上我在谷歌开发者网站上查看了这个,当我尝试创建一个时 - 它下载了一个证书到我的电脑,然后我需要用它做一些事情:-)。也许我因为谷歌流量而得到了错误的印象,但它看起来比重定向更糟糕。
  • 在查看了 salesforce 的这个页面之后 - 它比我想象的还要复杂:-) help.salesforce.com/…
  • 您不应该从头开始编写此代码:使用 JWT/JOSE 库来创建和签名它,您所要做的就是按照示例所示发布它。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 2016-11-18
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2017-02-02
  • 2017-03-11
相关资源
最近更新 更多