我试图在我的Rails后端和我的React前端之间建立一个最小的身份验证层,但我遇到了一些问题。
Set-Cookie:_skillcoop_session=....
,但是当我使用js-cookie
寻找上面的cookie,_skillcoop_session
时,我只看到一个叫identity-token=...
,它的值与_skillcoop_session
不同。如何在浏览器中访问_skillcoop_session
?Cookie: _skillcoop_session=....
session['init'] = true
这样的事情,我学会了从这个SO post做到这一点。这看起来很丑陋。为什么在先前在不同的请求中将其设置为不同的控制器操作之后,我必须在单独的控制器操作中手动重新加载会话?我目前正在简化用户和身份验证 - 我想要做的就是设置一个session[:user_id]
并能够在其他控制器操作中读取该会话数据。为此,我有两个主要文件供考虑:UsersController
和Transport.js
。在UsersController
中,我只是将session[:user_id]
与数字1对齐并且在Transport.js
中我想传递从服务器收到的cookie,以便后端可以维持与客户端的请求之间的会话。
这是我的控制器:
class UsersController < ApplicationController
def create
session[:user_id] = 1
render json: user_stub, status: :ok
end
def show
puts "user id: #{session[:user_id]}"
# should return, 1, but is returning, nil...why?
render json: user_stub, status: :ok
end
private
def user_stub
{
id: 1,
email: params['email'] || '[email protected]',
password: params['password'] || 'fake password'
}
end
end
这是我的应用程序的主要位置,我向服务器发出请求 - 它是一个抽象我称为Transport.js:
require('es6-promise').polyfill();
require('isomorphic-fetch');
var cookie = require('js-cookie');
const GET = 'GET';
const POST = 'POST';
function Transport() {
}
Transport.prototype.get = function(url, options = {}) {
return this.query(GET, url, null, options);
};
Transport.prototype.post = function(url, dataString, options = {}) {
return this.query(POST, url, dataString, options);
};
Transport.prototype.query = function(method, url, dataString, options = {}) {
var data;
if (dataString) {
data = JSON.parse(dataString);
}
switch(method) {
case GET:
return fetch(url, Object.assign({headers: {'Cookie': cookie.get('_skillcoop_session')}}, options, {
method: method
}));
case POST:
return fetch(url, Object.assign({
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
}, options, {
method: method
}));
default:
throw new Error("This HTTP Method is not supported.");
}
};
module.exports = Transport;
Set-Cookie
头。因此,我想我在响应头中处理Set-Cookie
的尝试是一种愚蠢的努力。{credentials: 'same-origin'}
键值对传递给fetch
,它将“自动为当前域发送cookie”。这样做了 - 会话对象可用,并包含在上一个请求中以不同操作在会话中设置的user_id
。localStorage
中。每个请求到服务器的请求都将在令牌AUTHORIZATION
中包含令牌。