React.js JWT Socket.io身份验证

时间:2018-12-23 19:18:05

标签: reactjs express socket.io jwt passport.js

我试图在React和Express Backend中使用Socket.io,后者使用JWT(Passport JWT)。 在我通常的路线中,我的Auth没问题。 发送Authorization标头(Authorization Bearer Token)并在后端进行检查,但是当我从React Client发送数据时,我只是不知道如何包括Bearer Token。

我查看了 extraHeaders 选项,但根本无法使它们正常工作。

这是我的代码:

class Chat extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      username: "",
      message: "",
      messages: []
    };


    this.socket = io("localhost:5000", {
      extraHeaders: {
        Authorization: "My Bearer authorization_token_here"
      }
    });

    this.socket.on("RECEIVE_MESSAGE", function(data) {
      addMessage(data);
    });

    const addMessage = data => {
      console.log(data);
      this.setState({ messages: [...this.state.messages, data] });
      console.log(this.state.messages);
    };

    this.sendMessage = ev => {
      ev.preventDefault();
      this.socket.emit("SEND_MESSAGE", {
        author: this.state.username,
        message: this.state.message
      });
      this.setState({ message: "" });
    };
  }
  render() {jsx code here}

已建立套接字连接,但是我不知道如何将令牌获取到服务器。理想情况下,我将在令牌中发送一个ID,在服务器上对其进行解码,然后在我的数据库中查找有关该用户的更多信息。

节日快乐,我非常感谢您的帮助或暗示如何解决我的问题。

1 个答案:

答案 0 :(得分:0)

按照规定,如果将传输选项设置为轮询,则the documentation extraHeader仅在浏览器中有效。

因此在服务器端启用轮询并使用以下代码段

io({ 
  transportOptions: {
    polling: {
      extraHeaders: {  "Authorization": "My Bearer authorization_token_here" }
    },
  }
});