token、cookie+sessionの2つの方法を使って、身分認証を実現します.
3541 ワード
token、cookie+sessionはnodejs環境下のモジュールに基づいています.身分認証の機能を実現するために使用できます.具体的な実現過程を見てください.
tokenモジュールで実現されたアイデア:
サービス側では、ユーザの登録記録を保存する必要はなく、クライアントが自分で保存する(cookie、local)1、クライアントがユーザ名とパスワードを使用してログインを要求します.2、サービス側は要求を受けて、ユーザ名とパスワードを検証します.3、認証が成功したら、サービス側はTokenを発行します.また、このTokenをクライアント4、クライアントはTokenを受け取ったら、CookieまたはLocal Strageの中に入れます.クライアントはサービス端末にリソースを要求するたびに、サービス端末で発行されたToken 6とサービス端末で要求を受けて、クライアント要求の中にあるTokenを検証します.検証が成功すれば、クライアントに要求されたデータを返します.
1、クライアントのユーザ名とパスワード要求登録2、サービス端末は要求を受けて、データベースに行ってユーザー名とパスワードを検証します.3、認証に成功した後、サービス端末はクッキーまたは文字をクライアントに送信します.サーバーはsession 4、クライアントが応答を受け取ったら、受信した文字をクッキー5、クライアントは、各サービス端末にリソースを要求するクッキーを自動的に6、サービス端末に要求を受けて、クッキーとセッションを検証します.検証が成功すれば、要求されたライブラリデータをクライアントに返します.
cookie+session
token
サービスでユーザ情報を保存します.
√
×
CSRF攻撃を避ける
×
√
取り付け性
一般
高さ
マルチサーバーの粘性問題
存在する
存在しません
どのようなサービス粘性の問題ですか?
アプリケーションでsessionの読み取り、書き込み、または削除操作を行うと、オペレーティングシステムのtempフォルダの下で少なくとも一回目のファイル操作が発生します.複数のサーバがあると仮定し、最初のサービスでセッションを作成します.再度要求を送信すると、この要求は他のサーバに落ちます.session情報は存在しません.「未認証」の応答が得られます.あなたが粘性sessionを通じてこの問題を解決できることを知っています.しかし、tokenによる認証では、この問題は自然に解決された.スティッキーセッションの問題はありません.サーバに送信する要求ごとに、この要求のtokenがブロックされます.
tokenモジュールで実現されたアイデア:
サービス側では、ユーザの登録記録を保存する必要はなく、クライアントが自分で保存する(cookie、local)1、クライアントがユーザ名とパスワードを使用してログインを要求します.2、サービス側は要求を受けて、ユーザ名とパスワードを検証します.3、認証が成功したら、サービス側はTokenを発行します.また、このTokenをクライアント4、クライアントはTokenを受け取ったら、CookieまたはLocal Strageの中に入れます.クライアントはサービス端末にリソースを要求するたびに、サービス端末で発行されたToken 6とサービス端末で要求を受けて、クライアント要求の中にあるTokenを検証します.検証が成功すれば、クライアントに要求されたデータを返します.
//1.
const express=require('express');
const bodyParser=require('body-parser');
const jwt=require('jsonwebtoken');
//2.
let server=express();
//3.
server.listen(9898,'localhost',function(){console.log(' 9898...')})
//4.
//4.1
server.get('/login',(req,res)=>{
//(1) ,
//(2) , token
let token=jwt.sign({
user:req.query.user // , token
},
'wang', // token
{
expiresIn:30 // token
}
)
//(3) token
res.send({
err:0,
msg:' , token ',
token:token
})
})
//5.
server.get('/user',(req,res)=>{
//(1) token ,
let token = req.query.token || req.body.token || req.headers.token;
//(2) token
jwt.verify(token,"wang",(err,decode)=>{ //err , token
if(!err){
res.send({
err:0,
msg:' '
})
}else{
res.send('token ')
}
})
})
cookie+sessionモジュールの実現の思想:1、クライアントのユーザ名とパスワード要求登録2、サービス端末は要求を受けて、データベースに行ってユーザー名とパスワードを検証します.3、認証に成功した後、サービス端末はクッキーまたは文字をクライアントに送信します.サーバーはsession 4、クライアントが応答を受け取ったら、受信した文字をクッキー5、クライアントは、各サービス端末にリソースを要求するクッキーを自動的に6、サービス端末に要求を受けて、クッキーとセッションを検証します.検証が成功すれば、要求されたライブラリデータをクライアントに返します.
// npm install cookie-session
//1.
let express = require("express")
//4. cookie-session
let cookieSession = require("cookie-session")
//2.
let serve=express()
//4. , cookie, session,
serve.use(cookieSession({
name:'mycookie', // cookie
keys:['a'] ,// , ,
// maxAge:1000*10 //cookie
}))
//3.
serve.listen(6767,function(){
console.log(' 6767')
})
//4. get
//4.1
serve.get('/login',function(req,res){
//1. , , ,
//2. ,
// , req.session , , , , mycookie cookie, ,
req.session.login='userid'
res.send(' , ')
})
//4.2
serve.get('/user',function(req,res){
// cookie session , ,
let pass = req.session.login;
if(pass){
res.send(' , ')
}else{
res.send(' , ')
}
res.end()
})
//4.3
serve.get('/logout',function(req,res){
// session cookie, req.session.login underfined
req.session.login=undefined;
res.send(' ')
})
二つの方法は、認証の比較を実現する.cookie+session
token
サービスでユーザ情報を保存します.
√
×
CSRF攻撃を避ける
×
√
取り付け性
一般
高さ
マルチサーバーの粘性問題
存在する
存在しません
どのようなサービス粘性の問題ですか?
アプリケーションでsessionの読み取り、書き込み、または削除操作を行うと、オペレーティングシステムのtempフォルダの下で少なくとも一回目のファイル操作が発生します.複数のサーバがあると仮定し、最初のサービスでセッションを作成します.再度要求を送信すると、この要求は他のサーバに落ちます.session情報は存在しません.「未認証」の応答が得られます.あなたが粘性sessionを通じてこの問題を解決できることを知っています.しかし、tokenによる認証では、この問題は自然に解決された.スティッキーセッションの問題はありません.サーバに送信する要求ごとに、この要求のtokenがブロックされます.