我正在开发一个浏览器(chrome和firefox(扩展,从数据库搜索引擎下载文件(不完全是这样,但类似(,以批量下载用户选择的所有数据集。问题是,这些数据集位于搜索引擎之外的6500台服务器上,其中大多数需要您登录。到目前为止,我已经尝试跟踪会话cookie中的更改,以确定何时提示登录。但是,当用户已经登录时,此代码会失败,因为会话cookie中没有更改,并且下载也没有启动。有人能给我一个通用的方法来确定用户是否登录吗?
这是我用来检查cookie的代码片段。
const onLoggedIn = (getSingleLink, callback) => {
let serverLink = getSingleLink();
chrome.cookies.getAll({url:serverLink.split("/", 3).join("/") }, (cookies)=>{
let baseLength = cookies.filter(cookie => cookie.session).length;
if(
baseLength >= cookies.filter(cookie => cookie.session).length ||
cookies.some(cookie => (cookie.name.match(/_urs-gui_session/g)))
){
const loginLink = serverLink.substring(0, serverLink.lastIndexOf("/"));
loginWindow = window.open(loginLink, null, 'width=600,height=600');
let loginInterval = setInterval(() =>{
chrome.cookies.getAll({url:serverLink.split("/", 3).join("/") }, (cookies)=>{
console.log(cookies);
if(
baseLength < cookies.filter(cookie => cookie.session).length &&
!cookies.some(cookie => (cookie.name.match(/_urs-gui_session/g)))
){
loginWindow.close();
clearInterval(loginInterval);
callback();
}
})
}, 500);
}else{
callback();
}
});
没有,因为不同的网站有不同的方式来识别用户和他们的会话,并且这些信息可以从网页中隐藏,因此不可能在所有情况下都处理:
一些网站会使用服务器端平台的会话状态系统,并在服务器端存储由其会话id引用的用户的安全声明(存储在cookie中(,但经过身份验证和未经身份验证的用户都有会话id,因此在这种情况下无法分辨(当然,如果页面上出现"登录"与"注销"链接或按钮,则除外(。
其他网站,如SPAs,可能使用OAuth/OIDC,并将其access_token
存储在localStorage
中,而不是存储在cookie中,然后将其作为额外的HTTP标头添加到XHR/fetch
请求中。
在LAN环境中,Web服务器可以使用NTLM/Kerberos来保护自己,它可以集成到客户端操作系统中(例如,带有Internet Explorer的Windows Active Directory域LAN中IIS中的NTLM(-在这种情况下,不可能不登录。