添加基本​​身份验证来表达rest api

Posted

技术标签:

【中文标题】添加基本​​身份验证来表达rest api【英文标题】:add basic auth to express rest api 【发布时间】:2022-01-20 14:57:33 【问题描述】:

所以我有rest api,我在mongoDB中存储用户数据,我想将基本身份验证添加到我的api但我卡住了,我想检查用户是否在某些路径上获得授权,例如在/update上,如果用户是 auth 执行请求,如果不发送该用户未授权

我存储用户的代码是 db

  const addUser = async (req, res) => 
  const checknick = await User.find( nickname: req.body.nickname ) //checks if user exists with nickname
  if (checknick.length !== 0) 
    return res.send(
      message: 'user already exists, please use another nickname',
    )
  

  const secretInfo = await hash(req.body.password).catch((err) =>
    res.send('password is required!')
  )
  const user = new User(
    name: req.body.name,
    surname: req.body.surname,
    nickname: req.body.nickname,
    password: secretInfo.password,
    salt: secretInfo.salt,
  )
  user.save((err, result) => 
    if (err) 
      return res.send(err)
    
    res.send('user added sucesessfully')
  )

我在哪里验证用户

const verify = async (req, res) => 
  const user = await User.findOne( nickname: req.body.nickname )
  if (!user) 
    return
  

  const  password  = await hash(req.body.password, user.salt).catch((err) =>
    res.send('password is required')
  )

  const verifiedUser = await User.findOne(
    nickname: req.body.nickname,
    password: password,
  )

  if (!verifiedUser) 
    return false
  
  return true

最后是登录逻辑

const login = async (req, res) => 
  const access = await verify(req, res)

  // console.log(req.headers)
  if (access) 
    res.send('logged in')
    console.log(req.headers)
    return
  
  return res.status(401).send('failed to login')

一切正常,但我想使用授权标头发送用户和密码信息

【问题讨论】:

【参考方案1】:

这是如何限制路由添加这个中间件功能之前 你想像这样限制的路线:

app.post("/update", restrictTo("admin"));

每个用户都必须有一个角色才能授权。这里我使用全局错误处理程序处理错误,但您可以通过其他方式处理错误:

exports.restrictTo = (...roles) => 
    return (req, res, next) => 
        if (!roles.includes(req.user.role))
            return next(
                new AppError('You dont have permission to do this action', 403)
            );
        next();
    ;
;

【讨论】:

以上是关于添加基本​​身份验证来表达rest api的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cognito 进行 REST API 身份验证

Spring Boot - 使用自定义 PreAuthorize 表达式和身份验证测试 Rest Api

如何从具有基本身份验证的 rest api 获取数据?

Rest API 基于令牌的身份验证。基本认证

外部身份验证提供程序和对 RESTful API 的请求的身份验证

使用 REST api 的 Guid 令牌而不是用户名/密码的基本身份验证