0

MEAN.JS と jsonwebtoken を使用して、簡単なサインアップ、サインイン、および記事を作成しました。ユーザーがすべての値を入力した後のサインアップページで、サインアップAPIを介してサーバーに値を渡しています。サーバー側でjsonwebtokenを作成し、クライアント側に渡しています

exports.create = function (req, res, next) {

    var newUser = new User(req.body);
    newUser.provider = 'local';
    newUser.role = 'user';

    newUser.save(function(err, user) {
        if (err) return validationError(res, err);
        var token = jwt.sign({
            _id: user._id
        }, config.secrets.session, {
            expiresInMinutes: 60 * 5
        });
        res.json({
            token: token
        });
    });
};

そのトークンクライアントを取得した後、いくつかの「私」APIを呼び出します(私が何を渡しているのかわかりませんでした)

クライアント側のサインアップ コントローラー:

$scope.register = function(form) {
   Auth.createUser({
     username: $scope.user.name,
     useremail: $scope.user.email,
     password: $scope.user.password
   })
};

認証サービス:

createUser: function(user, callback) {
    var cb = callback || angular.noop;

    return User.save(user,
      function(data) {
        $cookieStore.put('token', data.token);
        currentUser = User.get();
        return cb(user);
      },
      function(err) {
        this.logout();
        return cb(err);
      }.bind(this)).$promise;
  }

user.service :

.factory('User', function ($resource) {
    return $resource('/api/users/:id/:controller', {
      id: '@_id'
    },
    {
      changePassword: {
        method: 'PUT',
        params: {
          controller:'password'
        }
      },
      get: {
        method: 'GET',
        params: {
          id:'me'
        }
      }
      });
  });

サインアップ後:

get: {
        method: 'GET',
        params: {
          id:'me'
        }
      }

私はこれを理解していませんでした。サーバー側の「me」API では、次のルートのようになります。

router.get('/me', auth.isAuthenticated(), controller.me);

コントローラー:

exports.me = function(req, res, next) {
  var userId = req.user._id;
  User.findOne({
    _id: userId
  }, '-salt -hashedPassword', function(err, user) { 
    if (err) return next(err);
    if (!user) return res.status(401).send('Unauthorized');
    res.json(user);
  });
};

認証サービス:

var validateJwt = expressJwt({ secret: config.secrets.session });

/**
* Attaches the user object to the request if authenticated
* Otherwise returns 403
*/

function isAuthenticated() {
  return compose()
    // Validate jwt
    .use(function(req, res, next) {
      // allow access_token to be passed through query parameter as well
      if(req.query && req.query.hasOwnProperty('access_token')) {
        req.headers.authorization = 'Bearer ' + req.query.access_token;
      }
      validateJwt(req, res, next);
    })
    // Attach user to request
    .use(function(req, res, next) {
      User.findById(req.user._id, function (err, user) {
        if (err) return next(err);
        if (!user) return res.status(401).send('Unauthorized');

        req.user = user;
        next();
      });
    }).use(function (err, req, res, next) {
      if (err.name === 'UnauthorizedError') {
        var e = [];
        e.push(err);
        return res.status(401).send(e);
      }
    });
}

「me」APIで何を渡しているのか、exports.me関数で「req.user._id」をどのように取得しているかを知りたいです。「me」API (自分のもの) を作成したい場合、これを自分のトークンに渡すにはどうすればよいですか?

私はこれを取得しているサーバー側のコンソール: GET /api/users/me 200 876ms - 339b.

4

0 に答える 0