移动身份验证方法、JWT 和刷新令牌
Mobile authentication approaches, JWTs and refresh tokens
上下文
我正在与我的开发团队一起开发 client-server 架构中的移动应用程序,因为也会有一个网络客户端,允许一些用户(管理员)从浏览器执行某些操作。
REST Api 目前通过返回 JWT 形式的访问和刷新令牌来验证用户身份。本地(username/password)和 OAuth2.0(目前只有 Google)流都可用,因为我为用户提供了这两种不同的身份验证选项。
问题
当从 web 客户端调用 API 时,后续流程工作正常,但现在我们已经开始开发移动应用程序,出现了一个大问题:**我们如何让用户在移动应用程序上进行身份验证即使在刷新令牌过期之后?**
所有著名的应用程序都不会提示用户进行身份验证,比方说每周一次或最糟糕的是每天一次,但我仍然确信他们的身份验证实践(几乎)完美无缺。
尝试过的路径
我已经阅读了许多博客文章和文章,以及下面报道的一些 StackExchange 问答,但是在移动设备上处理身份验证和访问持久性的正确方法仍然不清楚。
我是否应该创建一个(或多个)特定端点以仅在 User-Agent
header 告诉 API 时提供 non-expiring 令牌由移动设备呼叫?
如 JWT (JSON Web Token) automatic prolongation of expiration 中所述,Auth0 放弃了用于移动设备的 JWT,转而使用随机生成的字符串。在这种情况下可以使用哪些实现?我是否应该将此字符串用作已验证设备的 never-ending ID 并批准所有附加了它的 API 调用?
在 OAuth 案例中,我是否应该执行(我不知道如何)静默调用 OAuth 提供程序以取回新的 idToken,然后向我自己的 API 有吗?
在本地情况下,我应该将用户凭据存储在本地吗?如果是这样,我该如何安全地做到这一点?
查阅资源
- What's the right OAuth 2.0 flow for a mobile app
- JWT refresh token flow
- Authenticating a mobile application with JWT and refresh tokens
- https://softwareengineering.stackexchange.com/questions/318471/jwt-refresh-token-exponentially
- https://auth0.com/docs/best-practices/mobile-device-login-flow-best-practices
- https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
- https://mobile-security.gitbook.io/mobile-security-testing-guide/general-mobile-app-testing-guide/0x04e-testing-authentication-and-session-management
- https://tech.justeattakeaway.com/2019/12/04/lessons-learned-from-handling-jwt-on-mobile/(更专注于改进已经建立的架构)
...以及更多我没有报告的问题范围之外。
一些图表
这些是我们目前实施的流程,当 API 被网络客户端使用时,它们会按预期工作。
本地
OAuth2.0
我认为该要求的格式不正确,感觉它是基于产品所有者的笼统陈述,没有考虑成本与收益:
- Gmail 让我永远保持登录状态,我希望我的应用程序能像那样工作
大型供应商
Google 之类的人经常使用定制的解决方案来分析用户模式,定期获得 2 因素确认和其他对普通公司来说非常昂贵的行动。
OAUTH
对于普通的软件公司,这个问题已经通过 OAuth 和 AppAuth 模式得到解决。 Curity Guides 如果您不熟悉它,请提供一个很好的起点:
- 编码后,您可以使用许多身份验证选项,而您的 UI 和 API 中的代码更改为零
- 支持用户友好的无密码选项,例如 WebAuthn
- 如果需要,您甚至可以支持 App2App Logins 等高级选项
- 移动代码和架构在所有情况下都保持简单
用户同意
另请注意,OAuth 是围绕用户同意应用程序在一段时间内使用他们的详细信息而构建的。我经常停下来想一想我是否在滥用它——如果用户的设备被盗会有什么影响——不确定这与你的场景有多大关系......
中间地带
对于大多数公司,我会推荐这种类型的选项,这样可用性就很好:
- 从用户友好的选项开始,例如 30 天刷新令牌
- 如果您使用密码登录,请确保密码自动填充有效 - AppAuth 将启用此功能
令牌
这些是由非您开发的授权服务器(AS)颁发的。将其视为提供 HTTPS 端点的 Docker 容器 - 使用免费或低成本的。
您提到的 Auth0 点背后的动机在 this article 中有很好的解释。移动应用程序只是将访问令牌发送到 API。您的代码中没有发行令牌,它仍然很简单。
摘要
更喜欢具有良好成本效益结果的经过行业标准验证的选项。尽管 OAuth 是高度架构化的,但您的公司需要管理学习曲线。
上下文
我正在与我的开发团队一起开发 client-server 架构中的移动应用程序,因为也会有一个网络客户端,允许一些用户(管理员)从浏览器执行某些操作。REST Api 目前通过返回 JWT 形式的访问和刷新令牌来验证用户身份。本地(username/password)和 OAuth2.0(目前只有 Google)流都可用,因为我为用户提供了这两种不同的身份验证选项。
问题
当从 web 客户端调用 API 时,后续流程工作正常,但现在我们已经开始开发移动应用程序,出现了一个大问题:**我们如何让用户在移动应用程序上进行身份验证即使在刷新令牌过期之后?**所有著名的应用程序都不会提示用户进行身份验证,比方说每周一次或最糟糕的是每天一次,但我仍然确信他们的身份验证实践(几乎)完美无缺。
尝试过的路径
我已经阅读了许多博客文章和文章,以及下面报道的一些 StackExchange 问答,但是在移动设备上处理身份验证和访问持久性的正确方法仍然不清楚。我是否应该创建一个(或多个)特定端点以仅在
User-Agent
header 告诉 API 时提供 non-expiring 令牌由移动设备呼叫?如 JWT (JSON Web Token) automatic prolongation of expiration 中所述,Auth0 放弃了用于移动设备的 JWT,转而使用随机生成的字符串。在这种情况下可以使用哪些实现?我是否应该将此字符串用作已验证设备的 never-ending ID 并批准所有附加了它的 API 调用?
在 OAuth 案例中,我是否应该执行(我不知道如何)静默调用 OAuth 提供程序以取回新的 idToken,然后向我自己的 API 有吗?
在本地情况下,我应该将用户凭据存储在本地吗?如果是这样,我该如何安全地做到这一点?
查阅资源
- What's the right OAuth 2.0 flow for a mobile app
- JWT refresh token flow
- Authenticating a mobile application with JWT and refresh tokens
- https://softwareengineering.stackexchange.com/questions/318471/jwt-refresh-token-exponentially
- https://auth0.com/docs/best-practices/mobile-device-login-flow-best-practices
- https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
- https://mobile-security.gitbook.io/mobile-security-testing-guide/general-mobile-app-testing-guide/0x04e-testing-authentication-and-session-management
- https://tech.justeattakeaway.com/2019/12/04/lessons-learned-from-handling-jwt-on-mobile/(更专注于改进已经建立的架构)
...以及更多我没有报告的问题范围之外。
一些图表
这些是我们目前实施的流程,当 API 被网络客户端使用时,它们会按预期工作。本地
OAuth2.0
我认为该要求的格式不正确,感觉它是基于产品所有者的笼统陈述,没有考虑成本与收益:
- Gmail 让我永远保持登录状态,我希望我的应用程序能像那样工作
大型供应商
Google 之类的人经常使用定制的解决方案来分析用户模式,定期获得 2 因素确认和其他对普通公司来说非常昂贵的行动。
OAUTH
对于普通的软件公司,这个问题已经通过 OAuth 和 AppAuth 模式得到解决。 Curity Guides 如果您不熟悉它,请提供一个很好的起点:
- 编码后,您可以使用许多身份验证选项,而您的 UI 和 API 中的代码更改为零
- 支持用户友好的无密码选项,例如 WebAuthn
- 如果需要,您甚至可以支持 App2App Logins 等高级选项
- 移动代码和架构在所有情况下都保持简单
用户同意
另请注意,OAuth 是围绕用户同意应用程序在一段时间内使用他们的详细信息而构建的。我经常停下来想一想我是否在滥用它——如果用户的设备被盗会有什么影响——不确定这与你的场景有多大关系......
中间地带
对于大多数公司,我会推荐这种类型的选项,这样可用性就很好:
- 从用户友好的选项开始,例如 30 天刷新令牌
- 如果您使用密码登录,请确保密码自动填充有效 - AppAuth 将启用此功能
令牌
这些是由非您开发的授权服务器(AS)颁发的。将其视为提供 HTTPS 端点的 Docker 容器 - 使用免费或低成本的。
您提到的 Auth0 点背后的动机在 this article 中有很好的解释。移动应用程序只是将访问令牌发送到 API。您的代码中没有发行令牌,它仍然很简单。
摘要
更喜欢具有良好成本效益结果的经过行业标准验证的选项。尽管 OAuth 是高度架构化的,但您的公司需要管理学习曲线。