Вход в Stormpath-express не работает с обычным именем пользователя: аутентификация по паролю
Я пытаюсь создать систему API NodeJS для настольного электронного приложения. Приложение должно разрешать базовый вход в систему с использованием имени пользователя и пароля, после входа пользователя все последующие вызовы API проходят проверку подлинности с помощью идентификаторов и секретных ключей. Я ссылаюсь на это руководство по использованию описания express-strompath здесь. Я не могу выполнить аутентификацию по имени пользователя и паролю, как это.
curl -L -H "Content-Type: application/json" -X POST -d '{"password":"Som3Pa55Word", "username":"user@domain.ai"}' http://ec2-54-88-168-7.compute-1.amazonaws.com:8000/api/v1.0/login
Или с помощью JavaScript
function Login() {
...
var user = {
username: 'user@domain.ai',
password: 'Som3Pa55Word ',
}
var req = {
method: 'POST',
url: apiBaseUrl + '/login',
headers: {
'Content-Type': 'application/json'
},
data: user
}
return $http(req).then(handleSuccess, handleError);
}
Однако, когда я использую ключ API, я могу войти в систему.
curl -L -H "Content-Type: application/json" -X POST --user ABCDEFGHIJKLMNOPQRSTUVWXYZ:AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz -d '{}' http://ec2-54-88-168-7.compute-1.amazonaws.com:8000/api/v1.0/login
Или с помощью JavaScript
var url = apiBaseUrl + '/login';
var sp_api_key_id = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var sp_api_key_secret ='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz';
get the Resource object w/ custom "get" method
$resource(url, {}, {
get: {
method: 'GET',
headers: {
Authorization: 'Basic ' +
$base64.encode(sp_api_key_id + ':' + sp_api_key_secret)
}
}
}).get().then(function(result) {
console.log("Loging Success")
});
Очевидно, неудобно, когда пользователи вводят свои ключи API в форму для аутентификации. Мне было интересно, почему Stormpath-Express принимает комбинации API ID/Secret, но не имя пользователя / пароль.
Вот код для моего сервера nodejs
router.post('/login', stormpath.loginRequired, function (req, res, next) {
/*
* If we get here, the user is logged in. Otherwise, they
* were redirected to the login page
*/
var respnse = {
message: 'If you can see this page, you must be logged into your account!'
}
res.json(respnse);
res.status(200);
});
И установочный код Stormpath
// Config
app.use(stormpath.init(app, {
// TODO
// apiKeyFile: './app/config/stormpath_apikey.properties',
application: 'https://api.stormpath.com/v1/applications/ABCDEFGHIJKLMNOPQRSTUVWXYZ',
secretKey: settings.stormpath_secret_key,
web: {
login: {
enabled: false
},
register: {
uri: '/user/register'
},
preLoginHandler: function (formData, req, res, next) {
console.log('Got login request', formData);
next();
}
},
postLoginHandler: function (account, req, res, next) {
console.log('User:', account.email, 'just logged in!');
next();
}
}));
2 ответа
Для веб-клиентов на основе angularJS мы можем либо использовать конечную точку /login и позволить браузеру управлять отправляемыми им файлами cookie, либо использовать конечную точку /oauth/token для получения токена доступа и обновления. Метод oauth2 подробно описан здесь и здесь. Метод oauth2 позволяет одноразово обменять их ключи API на токен доступа. Этот токен доступа ограничен по времени и должен периодически обновляться.
function Login(user) {
var apiBaseUrl = "https://api.stormpath.com/v1/applications/ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var sp_api_id = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var sp_api_secret = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
var req = {
method: 'POST',
url: apiBaseUrl + '/oauth/token',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: 'Basic ' + $base64.encode(sp_api_id + ':' + sp_api_secret)
},
data: 'grant_type=password&username=' + user.email + '&password=' + user.password
}
return $http(req).then(handleSuccess, handleError);
}
Я работаю в Stormpath. Функция аутентификации API Key, где учетным записям выдаются API-ключи, предназначена для использования на межсерверных клиентах, а не на клиентах веб-браузера. Таким образом, ключи API предназначены для использования с базовой аутентификацией HTTP или для обмена на токены доступа OAuth2. Обе эти стратегии описаны в этой документации:
http://docs.stormpath.com/nodejs/express/latest/authentication.html
http://docs.stormpath.com/nodejs/express/latest/authentication.html
Клиенты веб-браузера предназначены для использования /login
конечной точке, и они получают в ответ токен доступа Oauth2 и обновляют токен (мы храним их в безопасных файлах cookie). Это особый нюанс экспресс-штурма. Вы можете сделать правильный обмен паролями OAuth2, используя конечную точку oauth / token, которая также описана здесь:
http://docs.stormpath.com/nodejs/express/latest/authentication.html
Надеюсь, этот ответ поможет!