Kooa 2権限認証中間件-----Passport

3995 ワード

Kooa統合権限認証中間件のPassport
前言
       まだkoa 2の権限管理に悩んでいますか?この文章はあなたの悩みを解決します!!expressフレームの権限フレームpassportについてはよく知らないかもしれませんが、coa 2の権限管理ミドルウェアが不足しています.特に最も2.0バージョン以上のKooaは、生態は現在完全にスタート段階から出ています.しかし、オープンソースの力はいつまでも一番強いです.必要があれば、解決策があると思います.この時、koa-passportが誕生しました.
考え方
1、passportミドルウェアの公式はexpressに対するサポートを提供しただけです.しかし、これに対して、koaは対応するオープンソース集積バージョン「koa-passport」があります.
2、koa-passportは本質的に全く新しく実現された別のバージョンのpassportではなく、中間部品として、元のpassportからexpressに対する支持をkoaに転送しました.ソースを分析することによって、それは実際にはexpressのreqとresのAPIメソッドに結合されていることが分かります.
3、ツッコミを入れるところは、KOa-passportの公式文書の詳細な使い方と説明であり、公式に提供されたデモをそのまま使用しています.koa-passport-exampleプロジェクトは、修正しないと認証機能が完成しません.googleとbaiduの資料がたくさんありますが、残念ながら、この二つの統合記事についてはあまり多くないようです.関連しているのはすべて比較的に古いバージョンの文章です.あるいは実践しても効果がない文章です.あまり参考になりません.
この機会に、koa-passportとpassportのソースコードを分析して得られた成果を皆様に分かち合います.
ステップ
第一に、koa-passportを設置する.
npm install koa-bodyparser --save
npm install passport --save
npm install passport-local --save
npm install koa-passport --save
npm install koa-session2 --save 【           koa-session,      】
第二に、passportプロファイルpassport_を作成します.config.js
【UserModelはデータベースクエリパッケージです.ここでは省略します.】
const passport = require('koa-passport')
const LocalStrategy = require('passport-local')
const UserModel = require(__dirname + '/../../src/model/UserModel')

//          
passport.use(new LocalStrategy(
    /**
     * @param username         
     * @param password        
     * @param done             , passport  
     */
    function (username, password, done) {
        let where = { where: { username: username } }
        UserModel.findOne(where).then(function (result) {
            if (result != null) {
                if (result.password == password) {
                    return done(null, result)
                } else {
                    return done(null, false, '    ')
                }
            } else {
                return done(null, false, '    ')
            }
        }).catch(function (err) {
            log.error(err.message)
            return done(null, false, { message: err.message })
        })
    }
))

// serializeUser                        session  
passport.serializeUser(function (user, done) {
    done(null, user)
})

// deserializeUser            session        
passport.deserializeUser(function (user, done) {
    return done(null, user)
})

module.exports = passport
第三に、認証ルートを作成するxauth.js
【ここで使うのは、koa-routerのkoa 2バージョンです】
//     
const Router = require('koa-router')
//      
const router = new Router()
//     
const passport = require(__dirname + '/passport_config.js')

/**
 *     
 */
router.post('/xauth/login', function (ctx, next) {
    return passport.authenticate('local', function (err, user, info, status) {
        if (user) {
            ctx.body = 'Y'
            return ctx.login(user)
        } else {
            ctx.body = info
        }
    })(ctx, next)
})

/**
 *     
 */
router.get('/xauth/logout', function (ctx, next) {
    ctx.logout()
    ctx.body = 'Y'
})

//                
router.post('/xauth/test', function (ctx, next) {
    if (ctx.isAuthenticated()) {
        ctx.body = '    '
    } else {
        ctx.throw(401)
        ctx.body = '    '
    }
})

module.exports = router
最後に、KooaのAppでpassportを初期化し導入する.
//     
const bodyParser = require('koa-bodyparser')
const mount = require('koa-mount')
const session = require("koa-session2") 
const passport = require(__dirname + '/src/auth/passport_config.js')
const xauth = require(__dirname + '/src/auth/xauth.js')

//        
const app = new Koa()

//       
app.proxy = true    
app.use(session({key: "SESSIONID"}))
app.use(bodyParser())   
app.use(passport.initialize())
app.use(passport.session())
app.use(mount('/',xauth.routes()))