2017-04-11 5 views
0

Gibt es eine Möglichkeit, die Basisauthentifizierung oder JWT für die gleiche Route in Node zu verwenden, mit Koajs?Wie kann ich die Standardauthentifizierung oder JWT für dieselbe Route in Node verwenden?

versuchte ich 2 approachs:

  1. Koa Middleware, next() aufrufen, wenn es eine Bearer Token gehabt haben oder wenn eine Standardauthentifizierung gehabt haben, ein Token zu erstellen und zu ctx.headers gesetzt, aber es didn 't Arbeit

  2. Verwendung von getToken von Koa-JWT, aber ich kann nicht ein Versprechen, Benutzerinformationen zu laden, um ein Token zu erstellen.

+0

versuchen Sie Ihre Auth-Strategie zwischen jwt zu wechseln oder Basic Auth zur Laufzeit in einer einzigen Route? Ist das deine Frage? – shanks

+0

Ja, abhängig vom Autorisierungskopf. –

+0

Können Sie einen Beispielcode von dem, was Sie getan haben, zeigen? Ich würde eine CheckAuth Route Middleware erstellen und testen, ob das Token eine gültige JWT oder eine gültige Base64-Zeichenfolge ist und dann entsprechend handeln. – shanks

Antwort

0

Ich habe den Fehler gefunden. Ich habe vergessen, await zu verwenden, wenn Anruf next()

Thx @shanks für Ihre Zeit! Hier

ist der Arbeitscode:

route.js

'use strict' 

import Koa from 'koa' 
import mount from 'koa-mount' 
import jwt from 'koa-jwt' 
import basicAuth from './basic-auth' 
import HomeRouter from './home/router' 
import projectRouter from './v1/project/router' 

export default new Koa(). 
    use(mount('/', HomeRouter.routes())). 
    use(basicAuth). 
    use(jwt({ secret: process.env.JWT_SECRET })). 
    use(mount('/v1/projects', projectRouter.routes())) 

basic-auth.js

'use strict' 

import { chain } from 'lodash' 
import jwt from 'jsonwebtoken' 
import User from 'app/v1/user/model' 

function _createAccessToken(user) { 

    return jwt.sign({ 
    id: user.id, 
    email: user.email 
    }, process.env.JWT_SECRET) 
} 

export default async function basicAuth(ctx, next) { 

    const header = ctx.headers.authorization 
    if (/basic/i.test(header)) { 

    const password = chain(header). 
     split(' '). 
     last(). 
     value() 

    const user = await User.findOne({ 
     where: { 
     apiPassword: Buffer.from(password, 'base64').toString() 
     } 
    }) 

    if (!user) return ctx.throw(401) 
    const token = _createAccessToken(user) 
    ctx.headers.authorization = `Bearer ${token}` 
    } 
    await next() 
} 
Verwandte Themen