簡體   English   中英

rest api node.js的授權問題

[英]Authorization problem with rest api node.js

我有在Ubuntu中使用rest api的node.js包。 登錄時,此服務器(節點程序包)在json主體中給了我一個令牌。 因此,當我想在服務器中執行某項操作(任何請求)時,便使用此令牌。 但是,當我嘗試將登錄時提供的令牌服務器與客戶端發送到服務器的令牌進行比較時,會出現錯誤。

從服務器獲取令牌的代碼:

router.post('/login',(req,res)=>{ 
    const name = req.body.name;
    const password = req.body.password;
    console.log("Login request by "+name+" with password: "+password);
    if(name == "asdasd" && password == "asdadsad"){
      console.log("Auth succesful");
      const token = jwt.sign(
        {
          user: name,
          password: password
        },
        process.env.JWT_KEY,
        {
          expiresIn: "1h"
        }
      )
      return res.status(200).json({
        message:"Auth succesful",
        token: token
      });
    }else {
      return res.status(401).json({
        message:"Auth failed :("
      })
    }
})

使用給定令牌發出請求的代碼:

router.post('/add',checkAuth,(req,res,next)=>{ 
    console.log('haha');
    const { 
        fname, mname, lname, birthdate, created, updated, sex, place, title_id
        } = req.body
    pool.query(`INSERT INTO users (
        fname, mname, lname, birthdate, created, updated, sex, place, title_id
        ) VALUES ($1, $2,$3, $4,$5, $6,$7, $8,$9)`, [
        fname, mname, lname, birthdate, created, updated, sex, place, title_id
        ], (error, result) => {
      if (error) {throw error}
      res.status(201).send(`User added with ID: ${result.insertId}`)
    })
})

上面提到的作為checkAuth的代碼:

const jwt = require('jsonwebtoken')

module.exports = (req,res,next) =>{
    try{
        const decoded = jwt.verify(req.headers.authorization, process.env.JWT_KEY);
        req.userData = decoded;
        next();
    }catch (error) {
        return res.status(401).json({
            message: "Auth failed"
        });
    }
}

nodemon.json文件:

{
    "env": {
        "JWT_KEY": "secret"
    }
}

這是我用郵遞員或android studio連接到服務器時從服務器得到的json響應:

{
    "message": "Auth failed"
}

這是consol.log(process.env);的結果。

Object {ALLUSERSPROFILE: "C:\ProgramData", AMD_ENTRYPOINT: "vs/workbench/services/extensions/node/extensionHos…", APPDATA: "C:\Users\aydogan\AppData\Roaming", APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL: "true", CommonProgramFiles: "C:\Program Files\Common Files", …}
check-auth.js:6
[[StableObjectId]]:2
ALLUSERSPROFILE:"C:\ProgramData"
AMD_ENTRYPOINT:"vs/workbench/services/extensions/node/extensionHostProcess"
APPDATA:"C:\Users\aydogan\AppData\Roaming"
APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL:"true"
CommonProgramFiles:"C:\Program Files\Common Files"
CommonProgramFiles(x86):"C:\Program Files (x86)\Common Files"
CommonProgramW6432:"C:\Program Files\Common Files"
COMPUTERNAME:"AYDOGAN"
ComSpec:"C:\WINDOWS\system32\cmd.exe"
DriverData:"C:\Windows\System32\Drivers\DriverData"
FPS_BROWSER_APP_PROFILE_STRING:"Internet Explorer"
FPS_BROWSER_USER_PROFILE_STRING:"Default"
HOMEDRIVE:"C:"
HOMEPATH:"\Users\aydogan"
IntelliJ IDEA:"C:\Program Files\JetBrains\IntelliJ IDEA 2018.3.5\bin;"
LOCALAPPDATA:"C:\Users\aydogan\AppData\Local"
LOGONSERVER:"\\AYDOGAN"
NUMBER_OF_PROCESSORS:"8"
OneDrive:"C:\Users\aydogan\OneDrive"
OneDriveConsumer:"C:\Users\aydogan\OneDrive"

JWT_KEY似乎未定義,我可以通過debug看到它。

感謝您的幫助

您希望通過“ process.env”從環境中獲取JWT_KEY,但沒有為JWT_KEY設置任何環境變量。

您需要在項目的根目錄下創建.env文件 ,然后像JWT_KEY=******這樣放置JWT_KEY而不是nodemon.js文件,還需要通過npm install dotenv安裝dotenv軟件包並在您的內部使用它主文件為

index.js

// Read Environment Variables Config
const dotenv = require('dotenv');
dotenv.config();

...

.env

JWT_KEY=23489sgher8t238ifjk

這樣,您可以通過process.env獲取JWT_KEY。 另外,如果回購是公開的,我建議不要將.env文件推送到存儲庫中,並將其保留在本地以保護jwt密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM