У меня есть промежуточное программное обеспечение, отвечающее за авторизацию: loopback-auth-jwt , и я хочу применить его к большинству конечных точек, но не ко всем.Некоторые из конечных точек должны быть доступны, но если запрос имеет токен доступа, его следует использовать для аутентификации.Поэтому я написал промежуточное программное обеспечение, которое должно проверять токен и, если он есть, авторизовать пользователя, в противном случае он ничего не должен делать, поэтому пользователь будет считаться анонимным.Он отлично работает в локальной среде, но не работает на удаленном сервере.Честно говоря, я даже не знаю, как это отладить.Вот мое промежуточное программное обеспечение (это не код 1 к 1, но общая концепция здесь):
// Define routes that should be public and not protected by auth0 by default.
const EXCLUDED_ROUTES = [
'/api/projects/',
'/api/tasks/[a-z0-9]*',
'/api/projects/(task)/[a-z0-9]*'
];
module.exports = server => {
const auth0Jwt = require('loopback-auth0-jwt');
const jwtDecode = require('jwt-decode');
const authConfig = {
// ...
};
const auth = auth0Jwt(server, authConfig);
// Check if given URL should be considered as public or private route.
// This function is working as desired.
const isPublicRoute = url => {
let isPublic = false;
EXCLUDED_ROUTES.map(route => route.replace('/', '/')).forEach(pattern => {
const regex = new RegExp(pattern);
if (regex.test(url)) {
isPublic = true;
}
});
return isPublic;
};
// Middleware that depend on the result of isPublicRoute function applies auth0 middleware or not.
const authMiddleware = async (req, res, next) => {
const path = req._parsedUrl.pathname;
if (isPublicRoute(path)) {
// validate reuqest headers
if (!(req.headers && req.headers.authorization)) return next();
// ... some additional checks
const userWithToken = await server.models.User.findOne({where: { email: userEmail }, include: ['accessTokens']});
// no token was found, so we need to login user.
if (!userWithToken.accessToken) {
accessToken = await server.models.User.login({
// data
});
}
if (accessToken) {
req.accessToken = accessToken;
next();
} else {
next();
}
} else {
// route is not public - apply auth0 middelware.
server.use(path, auth.authenticated);
next();
}
};
// apply authMiddleware
server.use(authMiddleware);
server.enableAuth();
};