javascript - 通过 httponly cookie 授权
问题描述
我学习了Santum,我想制作授权系统。我制作了登录控制器,它返回一个令牌,但我需要将令牌发送到服务器。我读到最好的方法是使用 httpOnly cookie。看这个例子
function Login () {
const emailRef = useRef(),
passwordRef = useRef();
const [cookies, setCookie] = useCookies();
const handleSubmit = (event) => {
event.preventDefault();
instance.post('/api/auth/login', {
email: emailRef.current.value,
password: passwordRef.current.value
}).then(res => {
console.log(res.data.access_token);
setCookie('Authorize', res.data.access_token, {
httpOnly: true
})
})
}
return(
<div>
<form onSubmit={handleSubmit}>
<input ref={emailRef} type="text" />
<input type="password" ref={passwordRef} placeholder="password" />
<button role="submit">Wyślij</button>
</form>
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/me">About</Link>
</li>
</ul>
</nav>
<Switch>
<Route path="/about">
<About />
</Route>
</Switch>
</div>
</Router>
</div>
);
}
在此示例中,我发送请求,然后从服务器获取令牌。那么如何在标头中发送 cookie(因为我应该这样做来自动处理我的请求,是吗?)
解决方案
Cookie 由浏览器自动添加到请求中,您无需手动添加。浏览器现在将根据该 cookie 的属性(域、路径、是否是仅安全的 cookie、同一站点等)添加哪个 cookie 以及何时添加。
您正在尝试设置一个仅限 http 的 cookie。仅 HTTP cookie 是浏览器中运行的 Javascript 无法访问的 cookie。这意味着此类 cookie 应由后端服务器设置并与响应一起发送。您在前端的 Javascript 无法创建仅限 http 的 cookie。
因此,要解决您的问题,您可以尝试两种解决方案:
在服务器中设置带有令牌的 cookie(通过
Set-Cookie
在响应中添加标头)。然后它可以是一个仅 HTTP 的 cookie。它将自动添加到与服务器相同域的任何请求中。您可以像现在一样在 Javascript 中设置 cookie,但它不能仅是 HTTP,您应该添加
domain
参数以及您希望将 cookie 发送到的后端域。
请注意,第一个选项应该是首选选项。在第二种解决方案中,XSS 攻击将能够读取和写入您的 cookie。