我有两个链接的应用程序:一个在端口5000上充当服务器(快速),另一个在端口3000上充当客户端(React)。我想将数据从服务器发送到客户端 - 到一个特定的页面。
流速:
localhost:3000
localhost:5000/api/callback
router.get('/api/callback')
根据代码获取授权令牌,然后重定向到localhost:3000/dashboard
(通过React路由器显示仪表板组件)我意识到这很复杂,但基本上我遇到了麻烦;我还没有完全了解如何使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
然后传递必要数据的正确方法是什么?
答案 0 :(得分:3)
我认为将此令牌放在uri的#<token here>
位中的哈希是很常见的,您将用户重定向到UI。 uri的#
段不会发送到您重定向到的后端服务器,因此比将其放在?
后要好一些。然后你可以(在ui中)解析令牌并使用它来发出请求。通常通过传递http标头Authorization: Bearer ${token}
。
如果将其置于cookie中可以是唯一的http(这意味着UI无法以编程方式访问它),并且后端知道查看cookie以获取令牌。这长期(在我看来)比通过URL将访问令牌传递给UI更复杂。
回顾auth的流程/动态;以防它有用:
如果您有多个提供商可以使用选项2,那么选项2会更容易;例如facebook&amp;谷歌和dropbox,你有一个服务器来管理令牌。这是更经典的做事方式。
选项1是无服务器的,只需重定向回您的应用程序,让UI执行任何必要的身份验证流程,管理UI代码中的令牌和内容。