Dieses Mal werde ich Ihnen die Vorsichtsmaßnahmen für die Überprüfung der Knoten+Token-Implementierung vorstellen.
Kürzlich habe ich mich mit der tokenbasierten Authentifizierung befasst und diesen Mechanismus in mein persönliches Projekt integriert. Heutzutage hat sich die Authentifizierungsmethode vieler Websites von der traditionellen Seesion+Cookie-Methode zur Token-Verifizierung verlagert. Im Vergleich zu herkömmlichen Verifizierungsmethoden weisen Token eine bessere Skalierbarkeit und Sicherheit auf.Herkömmliche Sitzungs- und Cookie-Authentifizierung
Da HTTP zustandslos ist, wird die Identität des Benutzers nicht aufgezeichnet. Nachdem der Benutzer das Konto und das Kennwort an den Server gesendet hat, besteht der Hintergrund die Überprüfung, der Status wird jedoch nicht aufgezeichnet, sodass die nächste Benutzeranforderung weiterhin die Identität überprüfen muss. Um dieses Problem zu lösen, ist es notwendig, auf der Serverseite einen Datensatz zu generieren, der die Identität des Benutzers, also die Sitzung, enthält, diesen Datensatz dann an den Benutzer zu senden und ihn lokal im lokalen Bereich des Benutzers, also als Cookie, zu speichern . Als nächstes bringt die Anfrage des Benutzers dieses Cookie. Wenn das Cookie des Clients und die Sitzung des Servers übereinstimmen, bedeutet dies, dass die Identitätsauthentifizierung des Benutzers erfolgreich war.Token-Identitätsüberprüfung
Der Prozess ist ungefähr wie folgt:Beispiel
Wenn sich der Benutzer zum ersten Mal anmeldet, übermittelt er das Konto und das Passwort an den Server. Wenn der Server die Überprüfung besteht, wird der entsprechende Code wie folgt generiert:const fs = require('fs'); const path = require('path'); const jwt = require('jsonwebtoken'); //生成token的方法 function generateToken(data){ let created = Math.floor(Date.now() / 1000); let cert = fs.readFileSync(path.join(dirname, '../config/pri.pem'));//私钥 let token = jwt.sign({ data, exp: created + 3600 * 24 }, cert, {algorithm: 'RS256'}); return token; } //登录接口 router.post('/oa/login', async (ctx, next) => { let data = ctx.request.body; let {name, password} = data; let sql = 'SELECT uid FROM t_user WHERE name=? and password=? and is_delete=0', value = [name, md5(password)]; await db.query(sql, value).then(res => { if (res && res.length > 0) { let val = res[0]; let uid = val['uid']; let token = generateToken({uid}); ctx.body = { ...Tips[0], data: {token} } } else { ctx.body = Tips[1006]; } }).catch(e => { ctx.body = Tips[1002]; }); });
store.set('loginedtoken',token);//store为插件
service.interceptors.request.use(config => { let params = config.params || {}; let loginedtoken = store.get('loginedtoken'); let time = Date.now(); let {headers} = config; headers = {...headers,loginedtoken}; params = {...params,_:time}; config = {...config,params,headers}; return config; }, error => { Promise.reject(error); })
function verifyToken(token){ let cert = fs.readFileSync(path.join(dirname, '../config/pub.pem'));//公钥 try{ let result = jwt.verify(token, cert, {algorithms: ['RS256']}) || {}; let {exp = 0} = result,current = Math.floor(Date.now()/1000); if(current <= exp){ res = result.data || {}; } }catch(e){ } return res; } app.use(async(ctx, next) => { let {url = ''} = ctx; if(url.indexOf('/user/') > -1){//需要校验登录态 let header = ctx.request.header; let {loginedtoken} = header; if (loginedtoken) { let result = verifyToken(loginedtoken); let {uid} = result; if(uid){ ctx.state = {uid}; await next(); }else{ return ctx.body = Tips[1005]; } } else { return ctx.body = Tips[1005]; } }else{ await next(); } });
Klicken Sie hier, um den Front-End-Code anzuzeigen
Detaillierte Erläuterung der Codeaufteilung zur Optimierung der Vue-Paketierungsschritte
Vue2-Routing-Navigation und Axios-Interceptor-Paketierung
Das obige ist der detaillierte Inhalt vonKnoten+Token implementiert die Verifizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!