Использование koa-jwt с koa-router - PullRequest
0 голосов
/ 05 июня 2018

Я внедряю сервис Nextjs с koa, koa-router и kow-jwt, но меня смущает настройка маршрутизации с ними.

В моем проекте 2 страницы, одна из них - панель инструментова другой - логин.Приборная панель должна пройти проверку, а логин нет.Если аутентификация завершилась неудачно, перенаправьте пользователя на страницу входа.

Я выполнил поиск в Интернете и нашел несколько примеров, приведенных ниже, но ни один из них не объединяет их в цепочку.

Пожалуйста, дайте мне несколько советов, чтобы они хорошо работали вместе.

const app = next({dev});
const handle = app.getRequestHandler();

app.prepare()
  .then(() => {
    const server = new koa();
    const router = new koaRouter();        

    router.get('/login', async ctx => {
        await app.render(ctx.req, ctx.res, '/login', ctx.query);
        ctx.respond = false;
    });

    router.get('/dashboard', 
        jwt({
            secret: config.graphqlSecret
        }),
        async ctx => {
            await app.render(ctx.req, ctx.res, '/dashboard', ctx.query);
            ctx.respond = false;
        }
    );

    // what is the purpose of this route?
    router.get('*', async ctx => {
        await handle(ctx.req, ctx.res);
        ctx.respond = false;
    });

    server.use(async (ctx, next) => {
        try {
            await next();
        } catch (err) {
            if (err.statusCode === 401) {
                ctx.redirect('/login');
            }
        }
    });

    server.use(router.routes());
    server.use(router.allowedMethods());
    server.listen(3000);
});

с кодом выше, поведение:

  • Если я ссылаюсь на панель мониторинга с токеном jwt и без него, он всегда перенаправляется на страницу входа.
  • Если я ссылаюсь на панель мониторинга изМеню (реализуется с помощью <Link> в Nextjs) , показывает содержимое панели.

Спасибо за помощь.

1 Ответ

0 голосов
/ 19 июня 2018

Вам необходимо включить часть jwt в ваш server.use, а не в маршрутизатор.Сделайте два разных маршрутизатора, один с открытыми маршрутами и один с защищенными.Затем установите открытые маршруты, установите промежуточное ПО jwt, а затем установите защищенные маршруты:

const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare()
  .then(() => {
    const server = new Koa()
    const router = new Router()

    router.get('/login', async ctx => {
        await app.render(ctx.req, ctx.res, '/login', ctx.query);
        ctx.respond = false;
    });

    router.get('/dashboard', async ctx => {
        await app.render(ctx.req, ctx.res, '/dashboard', ctx.query);
        ctx.respond = false;
    });

    router.get('*', async ctx => {
      await handle(ctx.req, ctx.res)
      ctx.respond = false
    })

    // this will keep redirecting user to login until is logged in
    // if you remove it, will get an auth error unless you go manually
    // to the login path
    server.use(async (ctx, next) => {
        try {
            await next();
        } catch (err) {
            if (err.statusCode === 401) {
                ctx.redirect('/login');
            }
        }
    });

    // we need to do it this way because of the way nextjs works with '*' path    
    // Middleware below this line is only reached if JWT token is valid
    server.use(jwt({ secret: 'shared-secret' }).unless({ path: [/^\/b/] }));

    // specify in unless the unprotected path
    server.use(jwt({secret: config.graphqlSecret}).unless({ path: [/^\/login/] })).use(router.allowedMethods());

    // every route protected by default
    server.use(router.routes())

    server.listen(3000);
  })
...