在移动应用程序中,您可以创建一个 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 是否可以接受:
- 检查其 URL 是否与
aud
(受众)声明相同
- 检查 nonce 之前是否从未见过(使用
jti
, JWT ID, 声明)
- 检查此客户端是否可以请求此资源(使用
client_id
声明)
- 检查 nonce 不是很久以前创建的并且仍然有效(使用
exp
or expires 声明)
- JWT 的签名是有效的。这可以使用客户端的公钥来完成。
然而,这样做可能会导致信任意大利面。为避免这种情况,您的 OAuth 服务器可以改为将 nonce 嵌入到应用程序的 ID 令牌中,或允许客户端根据需要请求新的(例如通过执行令牌交换)。然后,API 只需要信任 OAuth 服务器,不需要跟踪客户端的公钥。如果您只有少数客户,但这并不难管理。