Unauthorized 401 Error: Causes and Solutions
Ошибка "unauthorized 401" означает отказ в авторизации, т.е. сервер не может распознать предоставленные учетные данные пользователя или авторизационный токен. В результате, сервер не дает доступ к запрашиваемому ресурсу.
Примеры кода, вызывающие ошибку "unauthorized 401":
1. Ошибка при запросе API с авторизационным токеном:
curl --header "Authorization: Bearer " https://api.example.com/resource
Если авторизационный токен недействителен или его значение, переданное в заголовке, не совпадает, сервер вернет ошибку 401 Unauthorized.
2. Ошибка при аутентификации пользователя:
if (!authenticate(username, password)) {
res.status(401).send('Unauthorized');
}
В данном случае, если аутентификация пользователя не прошла, то сервер вернет ошибку 401, что приведет к отказу в доступе к запрашиваемому ресурсу.
3. Ошибка при авторизации на основе ролей:
if (!user.hasRole('admin')) {
res.status(401).send('Unauthorized');
}
Если у пользователя не хватает прав на доступ к запрашиваемому ресурсу, сервер вернет ошибку 401 Unauthorized.
Для решения этой проблемы, необходимо выполнить корректную аутентификацию и авторизацию пользователей. Например, необходимо проверить, что пользователь предоставил корректные учетные данные и авторизационные токены, выполненная проверка ролей и прав доступа. Если данные не верны, сервер должен вернуть соответствующую ошибку авторизации с кодом 401.
Пример решения проблемы с помощью простенькой авторизации на основе токена:
// Генерация авторизационного токена
app.post('/login', function (req, res) {
const {user, password} = req.body;
if (user === 'admin' && password === 'admin') {
const token = jwt.sign({user}, 'secret_key');
res.json({token});
} else {
res.status(401).send('Invalid username or password');
}
});
// Проверка авторизационного токена
app.get('/resource', verifyToken, function (req, res) {
res.json({message: 'Success!'});
});
function verifyToken(req, res, next) {
const bearerHeader = req.headers['authorization'];
if (typeof bearerHeader !== 'undefined') {
const bearerToken = bearerHeader.split(' ')[1];
req.token = bearerToken;
jwt.verify(req.token, 'secret_key', function (err, authData) {
if (err) {
res.status(403).send('Forbidden');
} else {
req.authData = authData;
next();
}
});
} else {
res.status(401).send('Unauthorized');
}
}
В данном примере, сервер генерирует авторизационный токен при успешной аутентификации пользователя и сохраняет его на клиенте. Сервер также проверяет наличие правильного авторизационного токена при запросе защищенного ресурса. Это позволяет предотвратить ошибку "unauthorized 401".