我们正在为iOS构建一个React Native应用程序,我们正在使用基于node + express + jsonwebtoken构建的内部API。
当用户使用用户名/密码登录时,服务器会验证这些凭据并向客户端发回JSON Web令牌,然后必须将这些令牌与每个API请求一起发送。因此,React本机应用程序必须存储此令牌。
如何在React原生应用中安全存储此客户端令牌?除了将令牌存储在变量中之外,是否还需要采取任何其他步骤?
答案 0 :(得分:7)
对于iOS,您将其存储在钥匙串中...... https://auth0.com/docs/libraries/lock-ios/save-and-refresh-jwt-tokens
我发现,有几种方法可以做出反应原生的做法。可能还有其他人。可能有更好的选择。这正是我很快发现的。
https://github.com/search?utf8=%E2%9C%93&q=react-native+keychain
对于Android,您可以将其存储在SharedPreferences中,或者更好地存储在KeyStore中,因为它已在那里加密。
答案 1 :(得分:7)
要与app无关,我会使用ASyncStorage存储它。事实上,我正在对一个新项目进行测试。
答案 2 :(得分:0)
我最近在react-native中构建了一个钥匙串管理器,因此我可能可以为您提供帮助。
注意:此解决方案确实要求您的应用程序在Expo上运行。
要在设备上本地加密和存储令牌,可以使用名为expo-secure-store的软件包。
这将使您可以轻松访问iOS钥匙串和android keystore系统,并且可以通过以下方式实现:
import * as SecureStore from "expo-secure-store";
/**
* Saves the value to the ios keychain or Android keystore
* @param {string} key => the key you want to save the value for
* @param {any} value => the value you want to encrypt
* @return => A promise that will reject if value cannot be stored on the device.
*/
SecureStore.setItemAsync(key, value);
/**
* Fetches the value from the keychain/keystore for the specified key
* @param {string} key => the key you set for the value
* @returns {any} => A promise that resolves to the previously stored value, or null if there is no entry for the given key.
* The promise will reject if an error occurred while retrieving the value.
*/
SecureStore.getItemAsync(key);
/**
* Saves the value to the ios keychain or Android keystore
* @param {string} key => the key you want to save the value for
* @param {any} value => the value you want to encrypt
* @return => A promise that will reject if value cannot be stored on the device.
*/
SecureStore.deleteItemAsync(key);