如何在React Native应用程序中保持客户端JSON Web令牌安全?

时间:2016-01-19 06:56:45

标签: security token react-native json-web-token

我们正在为iOS构建一个React Native应用程序,我们正在使用基于node + express + jsonwebtoken构建的内部API。

当用户使用用户名/密码登录时,服务器会验证这些凭据并向客户端发回JSON Web令牌,然后必须将这些令牌与每个API请求一起发送。因此,React本机应用程序必须存储此令牌。

如何在React原生应用中安全存储此客户端令牌?除了将令牌存储在变量中之外,是否还需要采取任何其他步骤?

3 个答案:

答案 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);