web-dev-qa-db-ja.com

ReactネイティブアプリでクライアントJSONWebトークンを安全に保つ方法は?

IOS用のReactネイティブアプリを構築しており、ノード+ Express + jsonwebtokenで構築された内部APIを使用しています。

ユーザーがユーザー名/パスワードを使用してログインすると、サーバーはそれらの資格情報を検証し、クライアントにJSON Webトークンを送り返します。このトークンは、すべてのAPIリクエストとともに送信する必要があります。したがって、Reactネイティブアプリはこのトークンを保存する必要があります。

このクライアントトークンをReactネイティブアプリに安全に保存するにはどうすればよいですか?トークンを変数に保存するだけでなく、追加の手順を実行する必要がありますか?

11
Ryan

アプリにとらわれないように、 ASyncStorage を使用して保存します。実際、私はこれを新しいプロジェクトでテストしています。

7
James

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 に保存します。

7
Chris Geirman

私は最近、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);
0
Ryan Forte