Maison > cadre php > Laravel > le corps du texte

La différence entre le passeport de Laravel et jwt

(*-*)浩
Libérer: 2019-10-30 10:03:50
original
5487 Les gens l'ont consulté

La différence entre le passeport de Laravel et jwt

Introduction

Passport est un middleware Node.js qui fournit une variété d'authentifications de requêtes différentes et faciles à mettre en œuvre. . Par défaut, il stocke l'objet utilisateur dans la session. (Apprentissage recommandé : développement laravel)

JSON Web Token est une norme d'authentification qui fonctionne en attribuant et en transmettant des jetons cryptés dans les requêtes qui aident à identifier les utilisateurs connectés, au lieu de stocker les utilisateur dans une session sur le serveur et créant un cookie pour fonctionner. Il a différentes intégrations, notamment des modules Node.js.

Installer les dépendances.

npm install --save koa-passport  passport-jwt jsonwebtoken
Copier après la connexion

Flow

Lorsque l'utilisateur se connecte, le backend crée un jeton signé et le renvoie en réponse

Le client est dans Enregistrez le jeton localement (généralement dans localStorage) et renvoyez-le à chaque demande ultérieure nécessitant une authentification

Toutes les demandes nécessitant une authentification vérifient le jeton fourni via le middleware et uniquement La demande n'est autorisée que lorsque le jeton est vérifié

Jeton lors de la connexion

/**
 * @route POST api/users/login
 * @desc 用户登录接口
 * @access 都可访问
 */
router.post('/login', async ctx => {
    	//...获取数据 验证数据省略
        const payload = {
            name: user.name,
            email,
            avatar: user.avatar
        };
        //生成token
        const token = jwt.sign(payload, config.secretKey, {
            expiresIn: 3600 //存活时间
        });
        ctx.status = 200;
        ctx.body = {
            message: '验证成功',
            token: 'Bearer ' + token
        }
})
Copier après la connexion

Remarque : il doit y avoir un espace au milieu de 'Bearer', et le cas est également distingué...

Jeton d'analyse de connexion

/**
 * @route GET api/users/current
 * @desc 获取用户信息
 * @access 私密接口
 */
 //poassport.authenticate 则加入了认证权限,会调用 passport.js中
router.get('/current',passport.authenticate('jwt', { session: false }),async ctx=>{
	//获取 passport.js 中的返回值,去除密码并将结果返回到客户端
    const {password,...userInfo}=ctx.state.user._doc;
    ctx.body=userInfo;
})

//app.js
const passport = require('koa-passport');
app.use(passport.initialize())
app.use(passport.session())
//调用 passport.js 并将passport传入
require('./config/passport')(passport);
Copier après la connexion

config/passport.js

const config=require('./default');
const JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = config.secretKey;
// const User=require('../models/User');
const mongoose=require('mongoose');
const User=mongoose.model('users');
module.exports=passport=>{
    passport.use(new JwtStrategy(opts,async (jwt_payload,done)=>{
    	//jwt_payload 返回的是登录时返回的数据 即payload
        const user=await User.findOne(jwt_payload.id);
        if(user){
            done(null,user);
        }else{
            done(null,false);
        }
    }))
}
Copier après la connexion

ps Ceci est le code complet du modèle de connexion utilisateur

🎜>app.js

const Koa=require('koa');
const KoaRouter=require('koa-router');
const bodyParser=require('koa-bodyparser');
const mongoose=require('mongoose');
//const config=require('./config/default')
const passport = require('koa-passport');
//配置文件 这里就不单独抽离
const config={
	mogoUrl:'mongodb://localhost/koaTest',
    secretKey:'sercretKey',
}

const router=new KoaRouter();
const app=new Koa();

app.use(bodyParser());
//初始化 passport
app.use(passport.initialize())
app.use(passport.session())


//连接数据库
mongoose.connect(config.mogoUrl,{
    useNewUrlParser:true
}).then(res=>{
    console.log('mongoose connectd...');
})
.catch(error=>{
    console.log(error)
})

//引入 user.js
const user=require('./routes/api/user');

require('./config/passport')(passport);

//配置路由地址
router.use('/api/users',user);

//配置路由
app.use(router.routes()).use(router.allowedMethods());
const port=process.env.PORT||5000;
//监听端口
app.listen(port,()=>{
    console.log(`listing at ${port}`)
})
Copier après la connexion
routes/api/user.js

<🎜>
var Router = require(&#39;koa-router&#39;);
var router = new Router();
const User = require(&#39;../../models/User&#39;)
const bcrypt = require(&#39;bcryptjs&#39;);
const tools = require(&#39;../../config/tools&#39;)

const jwt = require(&#39;jsonwebtoken&#39;); //token 认证
const config = require(&#39;../../config/default&#39;);
const passport=require(&#39;koa-passport&#39;);

/**
 * @route POST api/users/login
 * @desc 用户登录接口
 * @access 都可访问
 */
router.post(&#39;/login&#39;, async ctx => {
    const {
        email,
        password
    } = ctx.request.body;
    const findResult = await User.find({
        email
    });
    const user = findResult[0];
    if (findResult.length === 0) {
        //表示不存在该用户
        ctx.status = 404;
        ctx.body = {
            message: &#39;该用户不存在&#39;
        };
        return;
    }
    //验证密码是否正确
    const verify = bcrypt.compareSync(password, user.password);
    if (verify) {
        //密码正确
        const payload = {
            name: user.name,
            email,
            avatar: user.avatar
        };
        //生成token
        const token = jwt.sign(payload, config.secretKey, {
            expiresIn: 3600
        });

        ctx.status = 200;
        ctx.body = {
            message: &#39;验证成功&#39;,
            token: &#39;Bearer &#39; + token
        }
    } else {
        ctx.status = 500;
        ctx.body = {
            message: &#39;密码错误&#39;
        };
    }

})

/**
 * @route GET api/users/current
 * @desc 获取用户信息
 * @access 私密接口
 */
router.get(&#39;/current&#39;,passport.authenticate(&#39;jwt&#39;, { session: false }),async ctx=>{
    const {password,...userInfo}=ctx.state.user._doc;
    ctx.body=userInfo;
})
module.exports = router.routes();
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal