我正在创建一个 express JS 微服务架构,并使用 express-gateway 作为 API 网关。
我可以通过 express gateway 公开我的服务和端点,其中一项服务(书籍)有 2 个角色(管理员、用户)和 2 个不同的登录 startegies(管理员使用 JWT,用户使用 Firebase auth)。
我使用 express-gateway 提供的 JWT 成功地保护了管理端点 /v1/admin,现在我想创建一个策略 / 插件(我不明白其中的区别)以涉及我的 CheckIfAuthenticatedFirebase 中间件来保护我的用户端点 /v1 /用户。
所以我需要一些帮助来了解我是否必须创建插件或策略以及执行它的步骤。
这是我的gateway.config.yml:
http:
port: 8080
admin:
port: 9876
host: localhost
apiEndpoints:
bookAdmin:
path: '/v1/admin*'
bookUser:
path: '/v1/user*'
serviceEndpoints:
book:
url: 'http://localhost:5000'
policies:
- cors
- log
- proxy
- jwt
- request-transformer
pipelines:
bookAdminPipeline:
apiEndpoints:
- bookAdmin
policies:
-
cors:
action:
origin: '*'
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE'
-
jwt:
action:
secretOrPublicKey: 'JWTKey'
checkCredentialExistence: false
-
proxy:
action:
serviceEndpoint: book
bookUserPipeline:
apiEndpoints:
- bookUser
policies:
-
cors:
action:
origin: '*'
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE'
-
proxy:
action:
serviceEndpoint: book
这是我的firebase-middleware.js:
var admin = require('../authentication/firebase');
getAuthToken = (req, res, next) => {
if (
req.headers.authorization &&
req.headers.authorization.split(' ')[0] === 'Bearer'
) {
req.authToken = req.headers.authorization.split(' ')[1];
} else {
req.authToken = null;
}
next();
};
checkIfAuthenticated = (req, res, next) => {
getAuthToken(req, res, async () => {
try {
const { authToken } = req;
const userInfo = await admin
.auth()
.verifyIdToken(authToken);
req.authId = userInfo.uid;
return next();
} catch (e) {
return res
.status(401)
.send({ error: 'You are not authorized to make this request' });
}
});
};
module.exports = checkIfAuthenticated
非常感谢