移动应用如何获得对其 API 的长期访问权限?

How do mobile apps gain long-lived access to their API's?

我们公司正在构建一个移动应用程序 (iOS),它需要与我们的 API 对话,它由 OpenIdConnect/OAuth2 保护,使用 IdentityServer

我的问题是,这些天我使用的大多数应用程序都要求用户 login/register 一次,然后再也不会。

假设他们使用 OAuth2 令牌访问 API,他们如何实现这一点?

OAuth 通过 "refresh" 令牌支持 offline_access,这允许用户无需再次登录即可获取新令牌。但是,它们也有到期时间 - 因此在以下情况下:

  1. 用户创建帐户,获取访问 token/refresh 令牌。访问令牌在 1 小时后过期,刷新令牌在 2 小时后。
  2. 用户正在使用该应用,应用在后台获取新的 access/refresh 令牌
  3. 用户关闭应用程序
  4. 用户第二天回来

此时,访问令牌和刷新令牌均已过期。他们如何在不提示用户再次输入凭据的情况下获得新凭据?

我了解 OpenIdConnect 具有 身份令牌 的概念,只要它在服务器上处于活动状态,就可以获取新的访问令牌而无需再次提示用户。

所以,我只能想到应用程序执行此操作的两种方式:

  1. 他们有后台服务 运行 当应用程序关闭时,它会不断获取新的 access/refresh 令牌。这可能吗?
  2. 在应用程序启动时,如果 access/refresh 令牌已过期但身份令牌(会话)仍处于活动状态,请静默访问身份验证服务器(隐藏的 Web 视图?),这将自动获得一个新的一组标记。

2 似乎可行,但这仅适用于涉及 SSO/cookies 的基于浏览器的 OAuth 流程(隐式授权代码)。

对于具有本机登录的应用程序(U/P 在应用程序中),它们很可能使用不支持 SSO 的 资源所有者密码凭据 流程(没有浏览器,没有 cookie)。那么他们将如何获得新令牌,除非他们在客户端应用程序本身中存储可逆 username/password,然后再次将它们传递给 Auth Server 以获取新令牌?

我错过了什么?

提前致谢。

这些应用程序通常使用 long-lived 刷新令牌,这些令牌不会像您建议的那样在 30 分钟内过期,但可能会持续很多 weeks/months 直到用户被迫再次登录。使刷新令牌的生命周期与访问令牌相同会破坏目的,因为刷新令牌应该是可用于在旧令牌过期时获取新访问令牌的令牌。刷新令牌通常比提供商处的用户身份验证会话更有效。

我们的 Nativescript Angular 应用程序也有类似情况。我们使用 OAuth 2 和 PKCE 进行身份验证过程,但我的团队对移动开发领域还很陌生。

根据我的研究,最佳实践似乎表明刷新令牌的生命周期应介于 2 周到 2 个月之间。目前我们的访问令牌寿命设置为 2 分钟,我们的刷新令牌寿命为 30 分钟。这意味着我们的用户必须每 30 分钟使用他们的用户名和密码登录一次,这对于用户体验来说并不理想,我们因此收到了很多批评。

我们的登录页面使用 WebView,因此我们还考虑尝试使用安全存储的用户名和密码版本自动填充表单字段,但后来意识到这实际上无法完成,而且对安全性也不利.

因此,为了改进登录过程并使其更加无缝,我们希望设置 face/touch ID 和 PIN 码备用。这意味着我们必须将刷新令牌的生命周期延长到 2 个月或尽可能长的时间——这似乎是向前发展的最佳方法。

也就是说,另一个问题是我们还有一个使用相同身份验证服务器的网站,因此如果我们更改 Keycloak 设置,它也会为该网站更改它,这将为网络团队带来更多工作.

所以我的问题是我们是否应该只为移动访问使用单独的身份验证服务器?