我正在创建一个网站,用户登录后可以在该网站上加载我正在开发的另一个网站。获得授权后,用户将获得JWT令牌,并且该令牌随每个请求一起发送到标头中,就像其他任何带有JWT令牌授权。
问题是我只想将敏感页面内容发送给授权的用户。后端中的授权已经可以使用普通的API调用,但是例如遇到“ src”标记时,我无法拦截系统本身进行的调用。
这样请求HTML文件(为方便起见,在此处而不是在单独的拦截器文件中添加标头令牌):
redirect(response) {
console.log(response);
if(response.isAdmin) {
const headers = new HttpHeaders().set("Authorization", "Bearer " + response.token);
this.http.get("AdminPage", {headers: headers, responseType: "text"}).subscribe(response => {
// response is the HTML file
const win = window.open("", "_self");
win.document.documentElement.innerHTML = response;
});
} else {
// The users page will be loaded here just like above, with another path
// TODO
}
}
已加载HTML文件,但是当它遇到其中的“ src”标记时,它将向服务器请求文件,但是服务器将不响应,因为请求中没有JWT令牌。
有没有办法拦截这个电话?还是有更好的方法来做到这一点?
(我不知道它是否相关,但是我的后端是用ASPNET.Core编写的)
答案 0 :(得分:0)
您可以像这样将其作为Get参数
<img src="http://img.com?token=<token>"/>
或者您可以使用建议的@matt之类的Cookie
答案 1 :(得分:0)
事实证明这确实很容易。您可以使用后端控制器(在ASPNET.Core中)中的以下代码将JWT令牌存储在cookie中:
CookieOptions cookieOptions = new CookieOptions();
cookieOptions.HttpOnly = true;
Response.Cookies.Append("auth_token", user.Token, cookieOptions);
您可以像这样在授权中间件中获取令牌:
string token = context.Request.Cookies["auth_token"];
与XSS攻击相比,将其存储在本地/会话存储中也更加安全。
我已经在这里阅读过
https://www.c-sharpcorner.com/article/asp-net-core-working-with-cookie/
在这里:
https://blog.logrocket.com/jwt-authentication-best-practices/
有了cookie,您甚至不需要在前端拦截http请求,因为cookie是随每个请求自动发送的。
@Matt Davis的积分