首页 > 解决方案 > 使用 jwt-webtoken 和请求使用远程 api

问题描述

我按照这个例子创建了一个 api:https ://github.com/eXtremeXR/APIAuthenticationWithNode (除了我使用 mysql)。当我通过邮递员对其进行测试时,一切正常。

现在......我想知道其他人如何正确使用/使用这个 api。到目前为止,我所拥有的是:

所以我有两个请求......第一个获得令牌:

第一个请求

const request = require("request");

request.post({
    headers: { "content-type": "application/json" },
    url: "http://127.0.0.1:2001/abc/login",
    body: JSON.stringify({
        email: "test@abc.it",
        password: "sisw9234&"
    })
}, (error, response, body) => {
    if(error) {
        return console.dir(error);
    }
    console.log(JSON.parse(body).token);
});

...第二个...当我用实际令牌替换 myToken 时...为我提供了请求的 json:

第二个请求

const request = require("request");

var token = 'myToken';
var auth = 'Bearer '+token;

request.get({
    headers: {
        "authorization": auth
    },  
    url: "http://127.0.0.1:2001/abc/search?name=peter"
}, (error, response, body) => {
    if(error) {
        return console.dir(error);
    }
    console.log(JSON.parse(body));
});

如何正确组合它们?

此外......令牌目前仅对 360 秒有效。处理这种情况的最佳方法是什么......有效令牌的持续时间,登录......?

标签: node.jsjwtnode-request

解决方案


1) 拿到token后,根据自己的业务逻辑,将其存入内存、REDIS、session等。之后,在调用其他 API 时,您可以从保存的位置取回它。

例如,

  • 如果令牌与每个用户相关,则应将其保存到会话中。使用 express 服务器,您可以使用npm install express-session.

  • 如果它用于您的应用程序调用其他服务,每个请求使用相同的令牌,您可以保存到内存中:global.GLOBAL_TOKEN = response.token

  • 如果您运行多个实例,则需要将其保存在 REDIS 等分布式缓存中

2)关于令牌过期,OAuth 的最佳实践是,当您登录时,服务器总是会再响应一个令牌(长期令牌、刷新令牌或任何您称之为的令牌)。您可以使用该刷新令牌来获取新令牌。

如果您没有那种令牌,您需要保存用户名、密码,就像保存令牌一样,再次登录以获取新令牌。

关于检查过期令牌。您可以使用JWT.decode,它不需要秘密来解码。通过这样做,您可以获得令牌过期的时间。检查的关键通常是expiat

关于 JWT 的更多信息可以在https://jwt.io/中找到

快速会话示例

app.use(session({ secret: 'some-secret-here', cookie: { maxAge: 60000 }}))

// login endpoint
app.post('/login', (req, res) => {
    request.post({
        headers: { "content-type": "application/json" },
        url: "http://127.0.0.1:2001/abc/login",
        body: JSON.stringify({
            email: req.body.email,
            password: req.body.password
        })
    }, (error, response, body) => {
        if(error) {
             res.write('login failed');
             return res.end();
        }
        // save token to session
        req.session.token = JSON.parse(body).token;
        res.write('login success');
        return res.end();
    });
});

// endpoint need token endpoint
app.get('something', (req, res) => {
    // use token to call the other things here 
    var token = req.session.token;
    res.write('your token ' + token);
    return res.end();
});

在客户端使用 localStorage 的示例:

常量请求 = 要求(“请求”);

request.post({
    headers: { "content-type": "application/json" },
    url: "http://127.0.0.1:2001/abc/login",
    body: JSON.stringify({
        email: "test@abc.it",
        password: "sisw9234&"
    })
}, (error, response, body) => {
    if(error) {
        return console.dir(error);
    }
    var token = JSON.parse(body).token;
    localStorage.setItem("USER_TOKEN", token);
});

第二个请求

const request = require("request");

var token = localStorage.getItem('USER_TOKEN');
var auth = 'Bearer '+token;

request.get({
    headers: {
        "authorization": auth
    },  
    url: "http://127.0.0.1:2001/abc/search?name=peter"
}, (error, response, body) => {
    if(error) {
        return console.dir(error);
    }
    console.log(JSON.parse(body));
});

希望这可以帮助。


推荐阅读