0

電子ベースのデスクトップ アプリケーション用の NodeJS API システムを作成しようとしています。アプリは、ユーザー名とパスワードを使用した基本的なログインを許可する必要があります。ユーザーがログインした後、後続のすべての API 呼び出しは ID と秘密鍵を介して認証されます。ここで、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 とシークレットの組み合わせを受け入れるのに、ユーザー名とパスワードは受け入れないのか疑問に思っていました。

これが私の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();
  }
}));

4

2 に答える 2

0

angularJS に基づく Web ベースのクライアントの場合、/login エンドポイントを使用して、ブラウザーが送信する Cookie を管理できるようにし、/oauth/token エンドポイントを使用してアクセスおよびリフレッシュ トークンを受信することができます。oauth2 メソッドについては、こちらこちらで詳しく説明しています。oauth2 メソッドを使用すると、アクセス トークンの API キーを 1 回交換できます。このアクセス トークンは時間制限があり、定期的に更新する必要があります。

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);
    }

于 2016-06-22T10:24:51.203 に答える