IOS用のReactネイティブアプリを構築しており、ノード+ Express + jsonwebtokenで構築された内部APIを使用しています。
ユーザーがユーザー名/パスワードを使用してログインすると、サーバーはそれらの資格情報を検証し、クライアントにJSON Webトークンを送り返します。このトークンは、すべてのAPIリクエストとともに送信する必要があります。したがって、Reactネイティブアプリはこのトークンを保存する必要があります。
このクライアントトークンをReactネイティブアプリに安全に保存するにはどうすればよいですか?トークンを変数に保存するだけでなく、追加の手順を実行する必要がありますか?
アプリにとらわれないように、 ASyncStorage を使用して保存します。実際、私はこれを新しいプロジェクトでテストしています。
IOSの場合、それをキーチェーンに保存します... https://auth0.com/docs/libraries/lock-ios/save-and-refresh-jwt-tokens
これが私が見つけたreactnativeでそれを行ういくつかの方法です。他にもあるかもしれません。より良いオプションがあるかもしれません。これは私がすぐに見つけたものです。
https://github.com/search?utf8=%E2%9C%93&q=react-native+keychain
Androidの場合は、 SharedPreferences に保存するか、暗号化されているので KeyStore に保存します。
私は最近、react-nativeでキーチェーンマネージャーを構築したので、あなたを助けることができるかもしれません。
注:このソリューションでは、アプリがExpoで実行されている必要があります。
トークンを暗号化してデバイスにローカルに保存するには、 expo-secure-store というパッケージを使用できます。
これにより、iOSキーチェーンとAndroidキーストアシステムに簡単にアクセスでき、次のように実装できます。
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);