使用oAuth登录移动应用和网络应用

时间:2012-11-20 16:06:39

标签: oauth-2.0

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

非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

在移动应用中,您可以创建一个随机数(一个令牌,该令牌应使用不超过一次)。然后,在打开网页链接时将其添加到URL。该令牌中应具有某种标识符。为该页面提供服务的Web应用程序应跟踪这些ID,以确保不会多次发送它(因此,使其成为现时)。这将独立于基于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编码的随机数后,您可以看到以下标头:

{
  "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可以通过以下方式决定随机数是否可以接受:

  1. 检查其网址是否与aud(受众群体)声明相同
  2. 检查以前是否从未发现过随机数(使用jti,JWT ID,声明)
  3. 检查此资源是否可以为该客户端请求(使用client_id声明)
  4. 检查随机数不是很久以前创建的,并且仍然有效(使用exp或过期声明)
  5. JWT的签名有效。可以使用客户端的公钥来完成。

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