[Q1] HTTPインターセプタは、config.headers ["Authorization"](フロントエンドAngularJS)を変更して、要求を確認してトークンの値を格納する際のメリットreq.cookiesオブジェクト? (バックエンドNodeJS)平均:
JSON Webトークンの機能を理解しようとしています。私がセットアップしたデモアプリケーションには、ログイン機能があります。
- GET '/ login'では、トークンを生成できます。そのトークンでクッキーを設定できます。
- フロントエンドでは、トークンを含むJSONオブジェクトにアクセスできます。
- 開発者コンソールでCookieを表示できます。
Nodejs:
index.js - ログイン経路
router.post('/login', function(req, res, next) {
Authenticator.find(req.cookies.token, req.body, Heartbeat.common, function(err, warning, data){
if(err) {
res.status(404).send({token:false, warning: null, error:err});
} else if(warning){
res.status(200).send({token:true, warning: warning, error:null});
} else {
res.cookie('token', data, {maxAge: 3600000, httpOnly:true});
res.status(200).json({token:true, error: null});
}
});
});
Authenticator.ctrl.js - Authenticator.find()
find: function(token, user, heartbeat, callback) {
if(!token) {
Auth.findOne({email:user.email}, function(err, data){
if(err) {
console.log(err);
} else {
if(data) {
if(data.checkHash(user.password)) {
callback(null, null,TokenMaker.createToken(user.email, heartbeat));
} else {
callback(Errors.login.strict.MISMATCH, null, null);
}
} else {
callback(Errors.login.strict.NOT_REGISTERED, null, null);
}
}
});
} else {
callback(null, Errors.login.warning.ACTIVE_REFRESH, null);
}
},
角度コントローラ
app.controller('userAccessCtrl', ['$scope', '$http', function ($scope, $http){
$scope.user = {
email: "[email protected]",
password: "12345679"
};
$scope.error = {};
$scope.loginAccess = function(user) {
var submitReady = true;
var emailStatus = EmailValidator.email(user.email);
var passwordStatus = EmailValidator.password(user.password);
if(typeof emailStatus === "string") {
$scope.error.email = emailStatus;
submitReady = false;
}
if(typeof passwordStatus === "string") {
$scope.error.password = passwordStatus;
submitReady = false;
}
if(submitReady) {
$scope.error = {}
var data = $scope.user;
$scope.user = {};
$http.post('/login', data)
.then(function(success){
console.log(success);
},function(error){
console.log(error);
});
}
}
}]);
コンソールの応答:
{
"data": {
"token":true,
"error":null
},
"status":200,
"config":{
"method":"POST",
"transformRequest":[null],
"transformResponse":[null],
"url":"/login",
"data":{
"email":"[email protected]",
"password":"12345679"
},
"headers":{
"Accept":"application/json, text/plain, */*",
"Content-Type":"application/json;charset=utf-8"
}
},
"statusText":"OK"
}
インターセプタのコードはどうですか?また、通常、クッキーの代わりにローカルとセッションのストレージを使用する人がいます。理想的には、バックエンドへの認証コールが成功した後にトークンを格納し、インターセプタはそれから値を取り出し、すべての要求に対してヘッダーを作成します。クッキーとストレージの使用方法は、トークンの設定方法、有効期限などが含まれます。違いを読んでください。 – Vaelyr
@Vaelyr私はこのような質問[リンク](http://stackoverflow.com/questions/3220660/local-storage-vs-cookies)を参照しました。私はクッキーとトークンの有効期限を設定しています。すべての連続したリクエストにクッキーのトークンが含まれている(JWTを保存してもサーバーに負担をかけない場合) –
2番目の質問を理解しているように、あなたはそうではないと思いますクッキーを稼働させることができますか?どのソリューションを選択しても、ヘッダまたはクッキーのどちらかを使って検証するために、バックエンドに渡す必要があります。ステートレスな機構なので、負担のあるサーバの反対側にあります。セッションはありません。ヘッダーを作成するコードを表示できますか? – Vaelyr