0

我正在开发一个在后端使用 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
            })
        });
}

我在写入文件后需要重新身份验证的代码中缺少什么?

4

0 回答 0