Я застрял, пытаясь создать кабель и канал для чата. Я работаю в 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),
);