node.js - 使用 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 秒有效。处理这种情况的最佳方法是什么......有效令牌的持续时间,登录......?
解决方案
1) 拿到token后,根据自己的业务逻辑,将其存入内存、REDIS、session等。之后,在调用其他 API 时,您可以从保存的位置取回它。
例如,
如果令牌与每个用户相关,则应将其保存到会话中。使用 express 服务器,您可以使用
npm install express-session
.如果它用于您的应用程序调用其他服务,每个请求使用相同的令牌,您可以保存到内存中:
global.GLOBAL_TOKEN = response.token
如果您运行多个实例,则需要将其保存在 REDIS 等分布式缓存中
2)关于令牌过期,OAuth 的最佳实践是,当您登录时,服务器总是会再响应一个令牌(长期令牌、刷新令牌或任何您称之为的令牌)。您可以使用该刷新令牌来获取新令牌。
如果您没有那种令牌,您需要保存用户名、密码,就像保存令牌一样,再次登录以获取新令牌。
关于检查过期令牌。您可以使用JWT.decode
,它不需要秘密来解码。通过这样做,您可以获得令牌过期的时间。检查的关键通常是exp
或iat
。
关于 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));
});
希望这可以帮助。
推荐阅读
- html - 在 Safari 上的 Bootstrap 轮播上禁用触摸滑动
- javascript - IOS 上的 service-worker 缓存慢
- fluent-assertions - 如何将子集集合按值(结构平等)与 FluentAssertions 进行比较?
- reactjs - 带有bg图像的jsPDF html2canvas保存空白pdf
- ms-access - 我可以使用什么事件来触发 Microsoft Access 中的进度条
- ruby-on-rails - Rspec测试回调方法
- javascript - 我对 if/else 语句有多项选择,但由于功能验证,在我单击否后它不会进入下一个问题
- typescript - 三.js | 着色相交网格重新着色每个网格
- node.js - 我的博客评论功能的 React.js 代码有什么问题
- spring-boot - 你如何断言删除方法无效