2

我们有一个 SSO 系统,供我们的 Web 应用程序使用,我们还计划编写一些新的移动/桌面应用程序。我一直在阅读有关使用 oAuth 2.0 的信息,因此用户可以使用应用程序(使用密码授予类型)本机登录,检索访问令牌并使用 REST Web 服务访问功能。问题是应用程序中的所有功能都不可用,在某些情况下,我们必须通过浏览器将用户重定向到 Web 应用程序。我已经读过我们不应该在 URL 中传递访问令牌,所以无论如何都可以使用 oAuth 自动登录到 Web 应用程序,而无需用户再次提交他们的用户名和密码?

任何建议将不胜感激。

4

1 回答 1

0

在移动应用程序中,您可以创建一个 nonce(一个只能使用一次的令牌)。然后,在打开网页链接时将其添加到 URL。这个令牌应该有某种标识符。为该页面提供服务的 Web 应用程序应跟踪这些 ID,以确保它不会被多次发送(因此,使其成为 nonce)。这将独立于基于 OAuth 的身份验证。因此,请求可能如下所示:

GET /anything?nonce=eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI5N1Y2ZU9WWlo1VGpPR3dWIiwiY2xpZW50X2lkIjoibXktZ29vZC1tb2JpbGUtYXBwLTIyIiwiYXVkIjoiaHR0cHM6Ly9leGFtcGxlLm9yZy9wYWdlLXRoYXQtaXMtbm90LWluLW15LW1vYmlsZS1hcHAiLCJleHAiOjE1OTg3NTI0NDB9.JoDstXRnC23PE8ZCqk-U-IzSNp_cUYa12HbajI1KGlF-OwRR46QRC_V7brcGOVdo5_Aw1RdpssNWCVFiGDeTBc8wi1lIJW-rgEGH5J1qUi8rL1T-yfy3vdLGPYzJMtHvCeyoEjgmoYOtZcpPSQScBJSRvId3Hdu3QgwcelSwljkeNJbZRCnG25HIqJfC1Cjm9vqHhvUGqtzbgVBUPnICiI8EZyGe3SpH2P4SxctLcgzWad8zJeyPFki3yfBHpqQ3mBWy0BbVdjzgD0mj323q1LWHR4kNkrH7cUJgAg4PlWahOW7Q4qcT3CBJYNtlh008ARqK7XagEQKX45vv5TfSlk2q7Zy06RnV2XwZXfLpyh-ZfURpcsxEJ3O-4NY71XxEqUtEyuisjQdZx5m95uzSrzk75F-ruQ3KYIouiAOAUDuMtFwhwjF68VdDeC4Zwt2q3BHzMBBp-8k1bAXq8e4dmHz0Jbuo9R8MJ2zSrVK6is5nNtNoJvYoXgc0WTA8MFqBj316cT_ouu-U1nTL3GR5sJ_lxorhP6xz0CqNxNY_90-JwOUB0UibUryRiXt-SUPJga36pBQ8eO8--Xupx_WU7CDIFdFvnLgJahD-4KmZcga6wCoqd-KKw3H5-jtbit06XMrKkDiWjz2g4eYhPR6xipbnqyZaaCwtYN4mAMz86ug HTTP/1.1
Host: example.org
Accept: */*

当 JWT 编码的 nonce 被解码时,你可以看到这个 header:

{
  "alg": RS256
}

这个身体:

{
  "jti": "97V6eOVZZ5TjOGwV",
  "client_id": "my-good-mobile-app-22",
  "aud": "https://example.org/page-that-is-not-in-my-mobile-app",
  "exp": 1598752440
}

现在,API 可以通过以下方式决定 nonce 是否可以接受:

  1. 检查其 URL 是否与aud(受众)声明相同
  2. 检查 nonce 之前是否从未见过(使用jti, JWT ID, 声明)
  3. 检查此客户端是否可以请求此资源(使用client_id声明)
  4. 检查 nonce 不是很久以前创建的并且仍然有效(使用expor expires 声明)
  5. JWT 的签名是有效的。这可以使用客户端的公钥来完成。

然而,这样做可能会导致信任意大利面。为避免这种情况,您的 OAuth 服务器可以改为将 nonce 嵌入到应用程序的 ID 令牌中,或允许客户端根据需要请求新的(例如通过执行令牌交换)。然后,API 只需要信任 OAuth 服务器,不需要跟踪客户端的公钥。如果您只有少数客户,但这并不难管理。

于 2020-08-30T14:07:53.737 回答