Auth0:有关移动应用程序令牌存储和流量的特定问题

时间:2019-03-27 01:40:46

标签: react-native authentication auth0

我正在构建一个本机应用程序,它将与我也编写/管理的API进行交互。我已经找到了用于实施此流程的Auth0文档,但不确定如何保存令牌。我想确定要钉牢此步骤,因为如果我做的不正确,我认为它有可能极大地降低流程的安全性。

据我了解,这是流程(没有错误处理,为简洁起见,只有高兴路径):

  • 用户首次进入该应用程序,或者尚未登录
  • 他们使用Auth0 web-login-thingy登录
  • 我收到令牌
  • 我可以使用令牌对我的API进行身份验证

问题:

  • 我是否存储该令牌?我不希望我的用户每次使用该应用程序时都必须登录。如果我确实存储令牌,该将令牌存储在哪里?

  • 如果我不存储它,该怎么办?每次他们打开应用并获取新令牌时,我都使用Auth0 ping身份验证/授权端点吗?

  • 说我要存储令牌,如果我使用ID令牌存储用户数据,是否应该定期再次访问API以保持其最新状态?仅当用户再次打开应用程序时?直到他们触发应用程序中的更改?

  • 我应该使用ID令牌获取用户ID并ping我的数据库来代替用户数据,而不是使用ID令牌存储用户数据吗?

我具有该流程的基础知识,并且可以对其进行沙箱处理,但是我想开始将适用于生产的应用程序逻辑应用于此流程,这就是我要坚持的地方。我在这里有点迷路,所以任何帮助都是很好的帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是使用Auth0时您的问题的简短答案:

  1. 是的!存储令牌时,最安全的令牌存储方式是在设备的本地存储中,这样就不会将令牌保持在应用程序状态或全局变量中。

2&3。参见上文,但要添加更多信息,您可以将令牌配置为具有有效期限。从理论上讲,您可以将此“有效期从开始”转换为日期对象,并且可以执行以下两项操作之一:您可以在到期后使用“刷新令牌”(原件随附)来请求新令牌,也可以强制用户此时重新登录并重新发行新令牌(我希望后者可以防止他人只要保持登录状态就可以永久地更新令牌)

  1. 登录后使用auth令牌请求用户信息,该信息可以存储在应用程序状态/全局变量/任意位置。然后,您想对每个API调用使用Authorization Header中的auth令牌,以及要发送的任何数据。这样可以确保即使有人在应用程序内部,他们也需要具有有效的令牌才能实际执行涉及数据的任何操作(想象有人向您的应用程序后门进入并跳过授权,或者使用邮递员之类的东西来破坏您的API )。它将像这样工作:GET userData {标头:auth令牌}-> GET userProfile(通过发送从GET userData返回的用户ID)加上{Header:auth令牌}

如果您愿意,我可以提供更多详细的示例,如果我误解了任何问题并给出了多余/错误的答案,我深表歉意

编辑:有关对密钥使用安全存储的资源

何时使用内存存储与持久存储的文档。如果密钥预计在标准会话持续时间之前到期,则TL; DR在内存​​中使用,并且在会话之间持久存储密钥 https://hackernoon.com/mobile-api-security-techniques-682a5da4fe10

链接到钥匙串服务文档 https://developer.apple.com/documentation/security/keychain_services#//apple_ref/doc/uid/TP30000897-CH203-TP1

链接到SharedPreferences文档 https://developer.android.com/reference/android/content/SharedPreferences.html

答案 1 :(得分:1)

  

AsyncStorage是一个简单的,未加密,异步,持久,   应用程序全局的键值存储系统。 [1]

您可以将其存储在AsyncStorage中,但这本身并不一定是安全的位置(例如,未加密,可以在有根设备上访问...)。通常,客户会发出访问令牌,访问令牌的持续时间从几个小时到几天不等,这些令牌将为其所有者提供对您的API资源的访问权限。如果您的登录屏幕后面有敏感数据,则最好重新执行auth-flow并在登录时使较旧的访问令牌无效。