我当前的设置是在 Heroku 上设置的 Node.js 应用程序,它应该使用这样的 Express.js 为我的客户端(React 应用程序)设置一些 cookie。
request.post(authOptions, function(error, response, body) {
if (!error && response.statusCode === 200) {
const access_token = body.access_token,
refresh_token = body.refresh_token;
let options = {
url: 'https://api.spotify.com/v1/me',
headers: { 'Authorization': 'Bearer ' + access_token },
json: true
};
request.get(options, function(error, response, body) {
res.cookie('access_token',access_token, { domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
res.cookie('refresh_token',refresh_token,{ domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
res.cookie('user',body.display_name,{ domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
res.redirect('https://www.example.com/');
});
} else {...}}
它确实设置了 cookie,但仅限于 Heroku 应用程序。我给出的域被完全忽略,这显然会导致当我尝试读取客户端的 cookie 时出现错误。有什么建议吗?
编辑:添加了完整的功能。
最佳答案
下面是一些非常简化的工作代码,用于演示响应网络请求时的 cookie 设置:
const express = require('express')
const rp = require('request-promise-native')
const app = express();
app.get("/cookie", function(req, res) {
rp.get('https://mobilesecurity.win/sample/access_token.json').then(function(body) {
const domain = 'localhost';
const parsed = JSON.parse(body);
const access_token = parsed.access_token;
const refresh_token = parsed.refresh_token;
res.cookie('access_token',access_token, { domain: domain, path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
res.cookie('refresh_token',refresh_token,{ domain: domain, path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
res.status(200).json({'status':'cookies set!'})
}).catch(function(error) {
res.status(500).json({'status':'failure', error:error.message});
});
});
app.listen(8080);
结果如下:
请注意,我使用 localhost
作为域,因为我在本地运行服务器。您必须使用与您的主机名匹配的域,否则浏览器将拒绝设置 cookie(出于安全原因)。
关于node.js - 向客户端发送 cookie,但 Express 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54524144/