将keycloak.protect()与express.Router()

时间:2018-12-08 15:57:38

标签: node.js keycloak

我想使用Keyclaok保护我的路线,Keyclaok是一种开源身份和访问管理。 我试图遵循他们的文档,但直到现在我都无法使其工作。

这是我的app.js文件:

const express=require('express);
const routePlaces= require('./routes/placesRoutes');

const Keycloak=require('keycloak-connect');
const session=require('express-session);
const memoryStrore= new session.MemoryStore();

let kcConfig={
    clientId='parking-app',
    bearerOnly:true,
    serverUrl:'localhost:8080/auth',
    realm:'FlexParking',
    reamlPublicKey:'MIIBIjANBg…...')
}

var keycloak=new KeyCloak({store: memoryStore},kcConfig);

app.use(keycloak.middleware({

//  here i think i have to place my routes

}));

app.use('/places, routePlaces);
module.exports=app;

服务器是在server.js文件中创建的,在尝试使用密钥斗篷之前,所有端点都可以正常工作。

这是我的routePlaces.js文件:

'use strict';
const express=require('express');
const place=require('../controllers/placesController);

router.route('/gps').get(place.get_place_by_gps);
router.route('/street').get(place.get_place_by_street);

module.exports=router;

这是我的placesController.js

'use strict';

exports.get_place_by_gps=(req,res,next)=>{
    res.send(' GET places by the GPS position');
}

exports.get_place_by_street=(req,res,next)=>{
    res.send(' GET places by the street name');
}

我希望使用keycloak.connect('...')和('/ places / street')来保护我的路线('/ places / gps')而没有任何保护。如何配置keycloak中间件来做到这一点?

app.use(keycloak.middleware({

//  here i think i have to place my routes

}));

我要保护的路线应该如何:

router.route('/gps').get(place.get_place_by_gps,keycloak.connect('user');

如上所述?

1 个答案:

答案 0 :(得分:2)

> app.use(keycloak.middleware({
> 
> //  here i think i have to place my routes
> 
> }));

不正确。您必须在此处传递options

    app.use(keycloak.middleware({
        logout: logoutUrl,
        admin: '/'
    }));
  

我要保护的路线应该如何:

     

router.route('/ gps')。get(place.get_place_by_gps,keycloak.connect('user');   上面的东西?

keycloak.middleware()

本身不做任何保护。它只是尝试从请求中获取grant数据,并将其放入特殊对象request.kauth.grant中。 它还做一些其他事情,例如检查注销请求。

要保护资源,您需要添加keycloak.protect()

 app.get('/gps', keycloak.protect(), handler);

要不保护资源,就不要添加任何内容

 app.get('/street', handler);

这是来自keycloak-nodejs-example的更复杂的示例, 它使用了自定义的中间件

middleware(logoutUrl) {
        // Return the Keycloak middleware.
        //
        // Specifies that the user-accessible application URL to
        // logout should be mounted at /logout
        //
        // Specifies that Keycloak console callbacks should target the
        // root URL.  Various permutations, such as /k_logout will ultimately
        // be appended to the admin URL.
        let result = this.keyCloak.middleware({
            logout: logoutUrl,
            admin: '/'
        });
        result.push(this.createSecurityMiddleware());
        return result;
    }


    createSecurityMiddleware() {
        return (req, res, next) => {
            if (this.permissions.isNotProtectedUrl(req)) {
                return next();
            }

            const permission = this.permissions.findPermission(req);
            if (!permission) {
                console.log('Can not find a permission for: %s %s', req.method, req.originalUrl);
                return this.keyCloak.accessDenied(req, res);
            }

            this.protectAndCheckPermission(req, res, next, permission.resource, permission.scope);
        };
    }


app.use(keyCloak.middleware('/logout'));

来源

https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/lib/keyCloakService.js#L69

https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/app.js#L60

您还可以使用keycloak-nodejs-example

中的(资源,范围)来引用更复杂的保护方案