Отправка параметров в заголовках с помощью ActionCable в React Native - PullRequest
0 голосов
/ 06 марта 2020

Я застрял, пытаясь создать кабель и канал для чата. Я работаю в native-реакции, и я использую серверную часть, созданную в Ruby на Rails, которая ожидает мой uid в параметре заголовка:

def find_verified_user # this checks whether a user is authenticated with devise
  User.find_by(uid: request.headers['HTTP_AUTHORIZATION']) || reject_unauthorized_connection
end

Что происходит, когда я застреваю в отклоненном несанкционированном соединении .

То, что я пытаюсь выяснить, - это то, как я могу отправлять реагирующие нативные заголовки при создании кабеля.

Я гуглил и смотрю здесь, и большинство ответов говорят, что это невозможно, но они с 2016 или 2017, так что, возможно, теперь это возможно? Я вижу решения, помещая параметры в url как queryparams, но в этом случае мне нужно изменить api моего бэкэнда, поэтому мне было интересно, есть ли другое решение без необходимости менять backend.

Я использую ActionCable из 'actioncable' .

Я пробовал использовать ActionCableJwt из'act-native-action-cable-jwt ', но либо я делаю что-то не так, либо это не так не помогу в моем случае.

Заранее спасибо. Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Показать код действия кабеля:

import { Platform } from 'react-native';
import ActionCable from 'actioncable';

import { ANDROID, IOS } from 'constants/common';

ActionCable.getConfig = () => null;

ActionCable.createWebSocketURL = url => url.replace(/^http/, 'ws');

const oldOpen = ActionCable.Connection.prototype.open;
ActionCable.Connection.prototype.open = function open() {
  const result = oldOpen.apply(this);
  this.webSocket.protocol = 'actioncable-v1-json';
  return result;
};

if (Platform.OS === IOS || Platform.OS === ANDROID) {
  global.document = {
    addEventListener() {},
    removeEventListener() {},
  };
}

export default ActionCable;

И когда я использую его (прямо сейчас с параметрами запроса вместо заголовков):

  import actionCable from './actionCable';
  import { applyQueryParams } from 'utils/helpers';

  let cable = null;

  return store => next => action => {
    switch (action.type) {
      case createConsumer.toString(): {
        cable?.disconnect();
        const { uid } = action.payload;
        const queryParams = {
          uid,
        };

        cable = actionCable.createConsumer(
          applyQueryParams(Config.CABLE_URL, queryParams),
        );
...