Вход в 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

Надеюсь, этот ответ поможет!

Другие вопросы по тегам