Auth0:关于移动应用程序令牌存储和流的具体问题
Auth0: Specific questions about token storage and flow for mobile app
我正在构建一个反应本机应用程序,它将与 API 交互,我也 write/manage。我找到了用于实现此流程的 Auth0 文档,但我不确定 where/when 是否可以保存令牌。我想确定我完成了这一步,因为我觉得如果我没有正确执行它,它有可能大大降低流程的安全性。
这是我理解的流程(没有错误处理,为了简洁起见只有快乐路径):
- 用户第一次进入应用程序,或尚未登录
- 他们使用 Auth0 web-login-thingy 登录
- 我收到一个令牌
- 我可以使用令牌对我的 API
进行身份验证
问题:
我是否存储该令牌?我不希望我的用户每次使用该应用程序时都必须登录。如果我存储令牌,我应该将它存储在哪里?
如果我不存储它,我该怎么办?每次他们打开应用程序并获得新令牌时,我是否使用 Auth0 ping authentication/authorization 端点?
假设我正在存储令牌,如果我将 ID 令牌用于用户数据,我是否应该定期再次点击 API 以使其保持最新状态?只有当用户再次打开应用程序时?直到他们触发应用程序的更改?
我应该只使用它来获取用户 ID 并 ping 我的数据库以获取用户数据,而不是将 ID 令牌用于用户数据吗?
我掌握了此流程的基础知识,并且能够对其进行沙盒处理,但我想开始将生产就绪的应用程序逻辑应用于此流程,这就是我遇到的问题。我在这里有点迷路,所以任何帮助都是很好的帮助。
谢谢!!
以下是您在使用 Auth0 时遇到的问题的简要回答:
- 是的!您存储它,存储令牌的最安全方式是在您设备的本地存储中,这样它就不会保存在应用程序状态或全局变量中。
2&3。见上文,但要添加更多信息,您可以将令牌配置为具有到期长度。从理论上讲,您可以将此 'expiry time from inception' 转换为日期 object,并且可以执行以下两项操作之一;您可以在到期后使用刷新令牌(原始令牌随附)请求新令牌,或者强制用户 re-log 进入并在此时重新发出新令牌(我更喜欢后者,防止人们只要保持登录状态就永远更新他们的令牌)
- 登录后使用授权令牌请求用户信息,这可以存储在应用程序中state/global variables/wherever。然后,您希望在授权 Header 中为每个 API 调用使用身份验证令牌,以及您发送的任何数据。这确保即使有人在应用程序内部,他们也需要有一个有效的令牌才能实际执行任何涉及数据的操作(想象一下有人 back-dooring 进入您的应用程序并跳过授权,或者使用邮递员之类的东西来敲打您的 API 垃圾)。它会像这样工作: GET userData { Header: auth token } -> GET userProfile(通过发送从 GET userData 返回的用户 ID) PLUS {Header: auth token }
如果您愿意,我可以提供更深入的示例,如果我误解了任何问题并给出了 redundant/incorrect 个答案,我深表歉意
编辑:关于使用密钥安全存储的资源
何时使用 in-memory 存储与持久存储的文档。 TL;DR 使用 in-memory 如果密钥预期在标准 session 持续时间之前过期,并且在 session 之间持久存储密钥
https://hackernoon.com/mobile-api-security-techniques-682a5da4fe10
link 钥匙串服务文档
https://developer.apple.com/documentation/security/keychain_services#//apple_ref/doc/uid/TP30000897-CH203-TP1
link 到 SharedPreferences 文档
https://developer.android.com/reference/android/content/SharedPreferences.html
AsyncStorage is a simple, unencrypted, asynchronous, persistent,
key-value storage system that is global to the app. [1]
您可以将它存储在您的 AsyncStorage 中,但这本身不一定是安全位置(例如,未加密,可在获得 root 权限的设备上访问...)。通常,客户会颁发持续数小时到几天不等的访问令牌,这些令牌将为其所有者提供对您的 API 资源的访问权限。如果您的登录屏幕后面有敏感数据,您最好重新执行身份验证流程并在登录时使旧的访问令牌无效。
我正在构建一个反应本机应用程序,它将与 API 交互,我也 write/manage。我找到了用于实现此流程的 Auth0 文档,但我不确定 where/when 是否可以保存令牌。我想确定我完成了这一步,因为我觉得如果我没有正确执行它,它有可能大大降低流程的安全性。
这是我理解的流程(没有错误处理,为了简洁起见只有快乐路径):
- 用户第一次进入应用程序,或尚未登录
- 他们使用 Auth0 web-login-thingy 登录
- 我收到一个令牌
- 我可以使用令牌对我的 API 进行身份验证
问题:
我是否存储该令牌?我不希望我的用户每次使用该应用程序时都必须登录。如果我存储令牌,我应该将它存储在哪里?
如果我不存储它,我该怎么办?每次他们打开应用程序并获得新令牌时,我是否使用 Auth0 ping authentication/authorization 端点?
假设我正在存储令牌,如果我将 ID 令牌用于用户数据,我是否应该定期再次点击 API 以使其保持最新状态?只有当用户再次打开应用程序时?直到他们触发应用程序的更改?
我应该只使用它来获取用户 ID 并 ping 我的数据库以获取用户数据,而不是将 ID 令牌用于用户数据吗?
我掌握了此流程的基础知识,并且能够对其进行沙盒处理,但我想开始将生产就绪的应用程序逻辑应用于此流程,这就是我遇到的问题。我在这里有点迷路,所以任何帮助都是很好的帮助。
谢谢!!
以下是您在使用 Auth0 时遇到的问题的简要回答:
- 是的!您存储它,存储令牌的最安全方式是在您设备的本地存储中,这样它就不会保存在应用程序状态或全局变量中。
2&3。见上文,但要添加更多信息,您可以将令牌配置为具有到期长度。从理论上讲,您可以将此 'expiry time from inception' 转换为日期 object,并且可以执行以下两项操作之一;您可以在到期后使用刷新令牌(原始令牌随附)请求新令牌,或者强制用户 re-log 进入并在此时重新发出新令牌(我更喜欢后者,防止人们只要保持登录状态就永远更新他们的令牌)
- 登录后使用授权令牌请求用户信息,这可以存储在应用程序中state/global variables/wherever。然后,您希望在授权 Header 中为每个 API 调用使用身份验证令牌,以及您发送的任何数据。这确保即使有人在应用程序内部,他们也需要有一个有效的令牌才能实际执行任何涉及数据的操作(想象一下有人 back-dooring 进入您的应用程序并跳过授权,或者使用邮递员之类的东西来敲打您的 API 垃圾)。它会像这样工作: GET userData { Header: auth token } -> GET userProfile(通过发送从 GET userData 返回的用户 ID) PLUS {Header: auth token }
如果您愿意,我可以提供更深入的示例,如果我误解了任何问题并给出了 redundant/incorrect 个答案,我深表歉意
编辑:关于使用密钥安全存储的资源
何时使用 in-memory 存储与持久存储的文档。 TL;DR 使用 in-memory 如果密钥预期在标准 session 持续时间之前过期,并且在 session 之间持久存储密钥 https://hackernoon.com/mobile-api-security-techniques-682a5da4fe10
link 钥匙串服务文档 https://developer.apple.com/documentation/security/keychain_services#//apple_ref/doc/uid/TP30000897-CH203-TP1
link 到 SharedPreferences 文档 https://developer.android.com/reference/android/content/SharedPreferences.html
AsyncStorage is a simple, unencrypted, asynchronous, persistent, key-value storage system that is global to the app. [1]
您可以将它存储在您的 AsyncStorage 中,但这本身不一定是安全位置(例如,未加密,可在获得 root 权限的设备上访问...)。通常,客户会颁发持续数小时到几天不等的访问令牌,这些令牌将为其所有者提供对您的 API 资源的访问权限。如果您的登录屏幕后面有敏感数据,您最好重新执行身份验证流程并在登录时使旧的访问令牌无效。