我想使用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');
如上所述?
答案 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
中的(资源,范围)来引用更复杂的保护方案