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
.