我正在构建一个反应应用程序,为了登录/验证用户,我正在使用auth0。
在使用 auth0 之前,我一直在对我的 API 进行 CRUD 调用来发布帖子。 这又是,在使用 auth0 之前和我有用户之前,所以我只是随意地发帖。
现在我正在使用 auth0,我已经设置了它,以便它将我创建的用户插入到我的 mongodb 中的Users
集合中。 因此,每个用户现在都有一个id
,我将使用它来关联帖子。
登录后,auth0 发送一个令牌(我存储在本地存储中),如下所示: eyJ0eXAiOiJKV1QiLCJhbGviOdJIUzI1NiJ9.eyJpc3MiOiJodHRwczovLzI4MTMzMC5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NTc4M2VjMjlkYmIxMAEwMTAwNTE1M2VmIiwiYXVkIeoiTzE3MGJkNnlnc3lCODkyY295Y25haVhyVkpQZHBUUlgiLCJleHAiOjE0Njw0NjkyMDQsImlhdCI6MTQ4ODDzMzIwNH0.gte9fxVURQGzOWD1ZF8AB-JachZuIkYmux6WKOZ-fdk
这是我的问题 - 如何对我的 CRUD API 进行经过身份验证的调用? 也就是说,只有登录用户才能进行 API 调用。 我还没有找到有关此主题的教程。
您要做的是将身份验证令牌设置为来自客户端的每个请求中的标头。 既然你说 auth0 正在为登录用户发送令牌,你可以简单地将此令牌(可能为了安全等而散列,但这个问题与安全性无关)存储在你的数据库中,在你的用户对象中。
在标头中设置令牌后,可以在 express 的 request
对象中获取它,然后在数据库中搜索它。 如果它有效,则表示您已成功对请求进行身份验证(并知道哪个用户发出了该请求)。 如果请求的标头中没有有效的身份验证令牌,则可以发回403
错误。
执行此操作的最简单方法可能是在中间件中,您可以在中间件中简单地对所有请求设置一个值,以跟踪它们是否经过身份验证。
例如,在快递中:
function checkAuth(req, res, next) {
//grab your auth token
var authToken = req.get('X-Authentication-Token'); //or whatever you've set the name of your auth header to be in the client
//decrypt it it you have to, etc.
//pseudo code. You'd have, for example, a function that would
//search for the auth token in your database, and return the user
//object if it exists, and throw an error if it didn't.
validateTokenFromDB(authToken).then(function(user) {
//you can set some values on your request here, so that they're
//available later to your handlers.
req.user = user;
req.authToken = authToken;
next();
}).catch(function(err) {
//return your 403.
return invalidRequest(req, res);
});
}
function invalidRequest(req, res) {
res.status(403);
res.end('{"error":"unauthorized"}');
}
现在,您可以将此中间件应用于要保护的任何路由。
同样,在我的示例中,我当然不处理令牌哈希,也不发送和发送带有纯文本、TLS 等的令牌。只是说明使用身份验证令牌的一般体系结构。
希望这有帮助!
我建议以持有者格式发送您的授权标头中的令牌:。您可以使用客户端密码验证令牌的签名,而不是存储令牌 - 这可以使用适用于 JSON Web 令牌的任何 SDK 来完成。可以在 React 的 Auth0 快速入门和所选技术的 Auth0 服务器教程中了解详细信息。
希望这有帮助!