我正在开发一个在后端使用 Node Express 并在前端使用 React 的网站。后端会定期向客户端发送身份验证请求,通常是在服务器重新启动时。
现在在我正在创建的下一个模块中,我正在将数据写入一个包含站点身份验证的 JSON 文件,并且每次执行此操作时都会请求身份验证。我假设这与 node-express-sspi 有关,尽管我的开发机器未连接到域,但我使用它在活动目录域上进行身份验证。
为什么它现在会要求身份验证?该文件被正确写入,当我重新加载客户端页面时显示更新的数据。
以下是后端涉及的 2 个函数以及前端 fetch 函数:
router.post('/AddPageToGroup/', async (req, res, next) => {
let results = {};
let userName = await Users.getUserName(req); //"gsutton"
if (!Users.isInRole(userName, 'Admin,System,BUS_RetailRpts')) {
results = { allowed: false, message: `${userName} does not have authority for this page` };
res.send(results);
}
else {
const props = req.body;
if (props.add) {
await Permissions.addPageToGroup(props.page, props.group)
}
else {
await Permissions.removePageFromGroup(props.page, props.group)
}
let users = Users.getUserRoleData; //returns {CollectorName: "", RoleName}
let pages = dataQuery.loadFile; //returns JSON: {"title": "Documents","description": "MetCredit Agent Documents","roles": "*,Admin,EVERYONE,System","parent": 1,"pageId": 2,"componentId": null, "children": []}
// get all data for users/groups and pages
let results = await (Promise.all([
users = await users(),
pages = await pages('./data/sitemap.json', 'ascii')
]))
ret = { users: results[0], pages: JSON.parse(results[1]) };
res.send(ret);
}
const RemovePageFromGroup = async (pageId, groupId) => {
//open /data/sitemap.json
//find item by pageId
//add groupId to roles
let siteMap = await dataQuery.loadFile('./data/sitemap.json', 'ascii');
siteMap = JSON.parse(siteMap);
//flatten JSON
let pages = utils.flatten(siteMap)
//add group
let keys = Object.keys(pages);
let keyList = [];
for (let key of keys) {
let k = key.split('.')
k.pop()
k = k.join('.');
if (!keyList.includes(k)) keyList.push(k)
}
pageId = +pageId.replace('page_', '')
let idx = keyList.find(page => {
let id = pages[page + '.pageId'];
if (id == pageId) {
return true;
}
});
let roles = pages[idx + '.roles'];
let roleList = roles.split(',');
let roleIdx=roleList.findIndex(role=>role.toLowerCase()===groupId.toLowerCase())
if (roleIdx >= 0) {
roleList.splice(roleIdx, 1)
}
roles = roleList.join(',');
pages[idx + '.roles'] = roles;
//unflatten JSON
siteMap = unflatten(pages);
let sm=[]
Object.keys(siteMap).map(key=>{
let k=siteMap[key];
sm.push(k)
})
dataQuery.writeFile('./data/sitemap.json', JSON.stringify(sm, null, 2))
}
export const fetchInit = () => {
return ({
method: 'GET'
, headers: {
'Content-Type': 'application/json'
}
, credentials: 'include'
})
};
export const AddPageToGroup = (pageID, groupName, add) => (dispatch,getState) => {
var init = JSON.parse(JSON.stringify(fetchInit()));//copy to not modify the original
init.method = "POST";
init.body = JSON.stringify({ page: pageID, group: groupName, add: add })
var myReq = new Request(`${process.env.REACT_APP_HOST}/Permissions/AddPageToGroup`, init);
return fetch(myReq)
.then((response) => {
if (response.ok) {
return response;
}
else {
var error = new Error("Error " + response.statusText);
error.response = response;
throw error;
}
}, (error) => {
var err = new Error(error.message);
throw err;
})
.then((response) => { return response.json() })
.then(async (RequestData) => {
console.log(RequestData)
if (RequestData !== "False") {
//prepare data for state: List of distinct group names
prepareData(RequestData, dispatch)
return dispatch(SetActiveGroup(getState().permissions.activeGroup));
}
else CurrentPage_Update({ componentId: 'NotAllowed' });
})
.catch((err) => {
dispatch({
type: ActionTypes.PERMISSIONS_FAILED,
payload: "Error: " + err.message
})
});
}
我在写入文件后需要重新身份验证的代码中缺少什么?