反应本机持久并加密用户令牌 - Redux-persist-transform-encrypt 错误

问题描述 投票:0回答:4

在react-native中使用redux-persist的加密选项似乎存在问题:

https://github.com/maxdeviant/redux-persist-transform-encrypt/issues/15

任何人都可以提供任何解决方案/解决方法来帮助使用 redux persist 在react-native中加密和存储登录令牌吗?

当我尝试将 redux persist 与 redux-persist-transform-encrypt 一起使用时,我得到了

Redux-persist-transform-encrypt: expected outbound state to be a string error

import { createStore, compose, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk';
import { persistStore, autoRehydrate } from 'redux-persist';
import { AsyncStorage } from 'react-native';
import createEncryptor from 'redux-persist-transform-encrypt';
import reducers from './reducers';


const store = createStore(
  reducers,
  {},
  compose(
    applyMiddleware(ReduxThunk),
    autoRehydrate(),
  ),
);

const encryptor = createEncryptor({
  secretKey: 'my-super-secret-key-999',
});


persistStore(
  store,
  {
    storage: AsyncStorage,
    whitelist: ['auth'],
    transforms: [encryptor],
  },
);
export default store;

我的身份验证状态是这样的:

const INITIAL_STATE = {
  user: null,
  token: ''
};

在使用redux persist时,有没有办法使用redux-persist-transform encrypt或者transform等包来加密token?

encryption react-native redux asyncstorage
4个回答
4
投票

我找到了一个使用 customTransform 而不是 redux-persist-transform-encrypt 的解决方案:

import { createStore, compose, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk';
import { persistStore, createTransform, autoRehydrate } from 'redux-persist';
import { AsyncStorage } from 'react-native';
import CryptoJS from 'crypto-js';
import reducers from './reducers';


const store = createStore(
  reducers,
  {},
  compose(
    applyMiddleware(ReduxThunk),
    autoRehydrate(),
  ),
);

const encrypt = createTransform(
  (inboundState, key) => {
    if (!inboundState) return inboundState;
    const cryptedText = CryptoJS.AES.encrypt(JSON.stringify(inboundState), 'secret key 123');

    return cryptedText.toString(); 
  },
  (outboundState, key) => {
    if (!outboundState) return outboundState;
    const bytes = CryptoJS.AES.decrypt(outboundState, 'secret key 123');
    const decrypted = bytes.toString(CryptoJS.enc.Utf8);

    return JSON.parse(decrypted);
  },
);

persistStore(
  store,
  {
    storage: AsyncStorage,
    whitelist: ['auth'], // <-- keys from state that should be persisted
    transforms: [encrypt],
  },
);
export default store;

当使用 redux-persist 时,初始状态会在补水完成之前被触发,所以我也必须应用这个:

https://github.com/rt2zz/redux-persist/blob/master/docs/recipes.md#delay-render-until-reHydration-complete


2
投票

这对我有用:

import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import createEncryptor from 'redux-persist-transform-encrypt';

import storage from 'redux-persist/lib/storage';
import rootReducer from '/path/to/your/rootReducer';

const encryptor = createEncryptor({
  secretKey: 'omg-this-is-some-secret-stuff',
});

const persistConfig = {
  key: 'root',
  storage,
  transforms: [encryptor],
};

const reducer = persistReducer(persistConfig, rootReducer);

export const store = createStore(reducer);
export const persistor = persistStore(store);

0
投票
This is working fine and store data in session storage.
Use below to encript redux data.
1) install redux-persist-transform-encrypt module
yarn add redux-persist-transform-encrypt
npm install redux-persist-transform-encrypt --save
2) import redux files.
import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import createEncryptor from 'redux-persist-transform-encrypt';
import storageSession from 'redux-persist/lib/storage/session';// store data in session storage
// import storage from 'redux-persist/lib/storage'; // store data in local storage
import promise from 'redux-promise';
import rootReducer from './path/reducers/';
const encryptor = createEncryptor({
  secretKey: 'test@key12',
});
const persistConfig = {
  key: 'root',
  storage:storageSession,
  // storage:storage,
  transforms: [encryptor],
}

const persistedReducer = persistReducer(persistConfig, rootReducer)

export default () => {
  let store = createStore(persistedReducer)
  let persistor = persistStore(store)
  return { store, persistor }
}

0
投票

就我而言,

我创建一个文件

encryptionTransform.js

var CryptoJS = require('crypto-js');
import {createTransform} from 'redux-persist';

const secureRandomKey = 'd5552d588d8c5b088f033296fffb7314';

// Custom encryption transform
const encryptionTransform = createTransform(
// Transform state on its way to being serialized and stored
(inboundState, key) => {
const jsonString = JSON.stringify(inboundState);
const encryptedData = CryptoJS.AES.encrypt(
  jsonString,
  secureRandomKey,
).toString();
return encryptedData;
},
// Transform state being rehydrated
 (outboundState, key) => {
 const bytes = CryptoJS.AES.decrypt(outboundState, secureRandomKey);
 console.log('bytes :====== ', bytes);
 const decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
 console.log('decryptedData :====== ', decryptedData);

 return decryptedData;
 },
);

export default encryptionTransform;

然后导入到我的商店

const persistConfig = {
  version: 0,
  key: 'root',
  storage: AsyncStorage,
  whitelist: persistWhitelist,
  timeout: 10000,
  transforms: [encryptionTransform],
};

const persistedReducer = persistReducer(persistConfig, reducers);
© www.soinside.com 2019 - 2024. All rights reserved.