我在 Express 中有一个服务器,它向 Web 应用程序公开一些 API。我正在寻找一种管理最终用户和第 3 方身份验证的好方法。
现在,当用户使用电子邮件和密码注册时,服务器会生成与该用户关联的 JWT。
function createToken(user, role) {
var usr = {
role: role, // admin | customer | shop
email: user.email,
name: user.name
};
var expires = (Date.now() / 1000) + 60 * 60 * 24 * 365; // 1 year
var nbf = Date.now() / 1000;
usr['nbf'] = nbf;
usr['exp'] = expires;
var token = jwts.encode(usr, process.env.SECRET);
return token;
}
当 Web 客户端收到该令牌时,它会将令牌存储在 cookie/web_storage 中,并将其用于对服务器的每个 API 调用以及自动登录。令牌还包含role
,因此当服务器收到请求时,它知道该用户/角色是否可以访问所请求的路由/资源。
function checkToken(token, api_name) {
// verifies secret and checks exp
jwt.verify(token, process.env.SECRET,
function (err, decoded) {
if (err) { throw { msg: "token expired or not authenticated", code: errors.ERR_NOT_AUTH }; }
else {
var role = decoded['role'];
return does_role_can_access_api(role, api_name); // true or false
}
});
}
现在一些第 3 方想要访问我的一些API。我想创建一个 Express-Gateway 来为想要使用我的服务器的应用程序制作 api-keys,并为单个用户保留现有的 JWT 身份验证。
所以我会有
|----------------|
| my Web-App |
|----------------|----> |------------| |------------|
| Express | | my Server |
| Gateway |----------> | APIs |
|----------------|----> |------------| |------------|
| 3rd party |
|----------------|
- 我的 Web-App 应该访问所有 API,因为我的 Web-App 被
admin
s(像我一样)和我们的用户(customers
和shops
)使用。 - 3rd 方应用程序应仅访问某些 API,因为它们将仅是
customers
和shops
.
所以我想做这样的事情:
|----------------|
| my Web-App |
| scopes: |
| [admin, user] |
| |
|----------------|----> |------------| |------------|
| Express | | my Server |
| Gateway |----------> | APIs |
|----------------|----> |------------| |------------|
| 3rd party |
| scopes: |
| [user] |
|----------------|
最后,我的 Web 应用程序将有一个包含所有范围的 ApiKey,而第 3 方 ApiKeys 将只有user
范围,所以我可以过滤路由。单个真实用户,无论使用何种 App,都将使用 JWT 令牌登录并发出请求。
因此,每个请求都会有一个 ApiKey(基于所使用的应用程序)和一个 JWT 令牌(用于识别用户):
- ApiKey 将由第 3 方服务器添加到标头中,
- JWT 令牌将由用户浏览器的 web_storage (检索并)添加到标头中。
听起来不错?