通过重定向将数据从Express发送到React

时间:2018-04-01 20:29:56

标签: node.js reactjs express react-router

我有两个链接的应用程序:一个在端口5000上充当服务器(快速),另一个在端口3000上充当客户端(React)。我想将数据从服务器发送到客户端 - 到一个特定的页面。

流速:

  1. 用户点击'登录'在localhost:3000
  2. 他们被重定向到外部网站,该网站返回代码并重定向到localhost:5000/api/callback
  3. router.get('/api/callback')根据代码获取授权令牌,然后重定向到localhost:3000/dashboard(通过React路由器显示仪表板组件)
  4. 仪表板通过从服务器抓取令牌将令牌保存在其状态中
  5. 然后,仪表板将调用服务器以获取基于令牌的其他数据
  6. 我意识到这很复杂,但基本上我遇到了麻烦;我还没有完全了解如何使Express和React正常通信。

    在server.js中:

    router.get('/callback', async (req, res) => {
        const code = req.query.code;
        const token = await getAuthorizationTokenFromExternalSite(code);
    
        // Poor attempt to persist data
        res.cookie('token', token);
    
        // Poor attempt to let the user see this URL
        res.redirect("http://localhost:3000/dashboard");
    });
    
    router.get('/dashboard', (req, res) => {
        res.send({ token: req.cookies['token'] });
    });
    

    的客户机/ SRC / App.js

    class App extends Component {
    
        render() {
            return(
                <BrowserRouter>
                    <div>
                        <Route exact path="/" component={LoginPage} />
                        <Route path="/dashboard" component={Dashboard} />
                    </div>
                </BrowserRouter>
            );
        }
    
    }
    
    export default App;
    

    的客户机/ SRC / Dashboard.js

    class Dashboard extends Component {
    
        state = { token: null };
    
        componentDidMount() {
            fetch('/api/dashboard')
              .then(res => this.setState({ token: res.token }));
        }
    
        render() {
            return(
                <div>
                    Tis the Dashboard, the token is {this.state.token}.
                </div>
            );
        }
    
    }
    
    export default Dashboard;
    

    将用户从服务器带回localhost:3000然后传递必要数据的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

我认为将此令牌放在uri的#<token here>位中的哈希是很常见的,您将用户重定向到UI。 uri的#段不会发送到您重定向到的后端服务器,因此比将其放在?后要好一些。然后你可以(在ui中)解析令牌并使用它来发出请求。通常通过传递http标头Authorization: Bearer ${token}

如果将其置于cookie中可以是唯一的http(这意味着UI无法以编程方式访问它),并且后端知道查看cookie以获取令牌。这长期(在我看来)比通过URL将访问令牌传递给UI更复杂。

回顾auth的流程/动态;以防它有用:

  • 用户点击页面
  • 点击登录,并被重定向到登录提供商protal,或者有一个弹出式节目
  • 用户输入数据并将其提交给后端,后端使用代码将其重定向到目标平台。如果您尝试无服务器,通常可以在此时直接向UI提供访问令牌。这基于登录提供程序的设置中的配置。
  • 您的后端使用该代码请求访问/刷新令牌。
  • 获得访问/刷新令牌后,您可以安全地保存它们,然后您可以选择:
    1. 将访问令牌直接移交给重定向中的UI。因此,用户界面可以直接向您授权的提供商提出请求。
    2. 生成您自己的令牌(例如JWT)并刷新令牌,并将这些令牌提供给UI。如果用户界面需要来自提供商的数据,他们会使用您的令牌呼叫您的后端,并在内部管理对提供商的呼叫。

如果您有多个提供商可以使用选项2,那么选项2会更容易;例如facebook&amp;谷歌和dropbox,你有一个服务器来管理令牌。这是更经典的做事方式。

选项1是无服务器的,只需重定向回您的应用程序,让UI执行任何必要的身份验证流程,管理UI代码中的令牌和内容。