我们的Web应用程序使用了SSO系统,我们还计划编写一些新的移动/桌面应用程序。我一直在阅读有关使用oAuth 2.0的信息,因此用户可以使用应用程序本地登录(使用密码授予类型),使用REST Web服务检索访问令牌和访问功能。问题是应用程序中无法使用所有功能,在某些情况下,我们必须通过浏览器将用户重定向到Web应用程序。我已经读过我们不应该在URL中传递访问令牌,所以无论如何都要使用oAuth自动登录Web应用程序而无需用户再次提交用户名和密码?
非常感谢任何建议。
答案 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可以通过以下方式决定随机数是否可以接受:
aud
(受众群体)声明相同jti
,JWT ID,声明)client_id
声明)exp
或过期声明)但是,这样做可能会导致信任问题。为避免这种情况,您的OAuth服务器可以将随机数嵌入到应用程序的ID令牌中,或允许客户端根据需要(例如通过执行令牌交换)请求新的令牌。然后,API只需要信任OAuth服务器,而无需跟踪客户端的公钥。如果您只有少量客户,这将不难管理。