我正在设置一个受 KeyCloak 保护的 Node.js 服务器。这是我第一次使用 KeyCloak,我正在尝试各种用例。
我成功地实现了我使用express-session
并MemoryStore
与公共客户端一起使用的场景。这是我的keycloak.json
:
{
"realm": "keycloak-node-monolith",
"auth-server-url": "http://localhost:8180/auth",
"ssl-required": "external",
"resource": "keycloak-node-monolith-public",
"public-client": true,
"confidential-port": 0
}
Run Code Online (Sandbox Code Playgroud)
这是我的工作服务器代码:
var session = require('express-session');
var Keycloak = require('keycloak-connect');
var express = require('express');
var app = express();
var memoryStore = new session.MemoryStore();
app.use(session({
secret: 'uhlulululu',
resave: false,
saveUninitialized: true,
store: memoryStore
}));
var keycloak = new Keycloak({ store: memoryStore });
app.use( keycloak.middleware());
app.get( '/check-sso', keycloak.checkSso(), (req, res) => {
res.send('Check sso success');
});
app.get( '/protected', keycloak.protect(), (req, res) => {
res.send('Protected content visible to you, because you are authenticated.');
});
app.listen(4000, '0.0.0.0', () => {console.log('App listening on port 3000');});
Run Code Online (Sandbox Code Playgroud)
我无法更改上述工作代码以使用 cookie 而不是 MemoryStore。
我keycloak.json
的和上面一样,它正在工作,所以我认为没有理由改变它。
我在我的代码中应用了以下更改:
{ cookies: true }
. 我非常有信心这是一个很好的举措,这将keycloak-connect
使用内置的CookieStore
.cookieParser
了使 cookie 可用。cookie-session
or express-session
,否则我会收到关于 missing 的错误session.id
。这是我现在的代码:
var Keycloak = require('keycloak-connect');
var express = require('express');
var cookieSession = require('cookie-session');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var app = express();
app.use(cookieParser('secret123'));
//app.use(session({
// secret: 'secret123',
// resave: false,
// saveUninitialized: true,
// cookie: {}
//));
app.use(cookieSession({
name: 'session',
secret: 'secret123',
maxAge: 24 * 60 * 60 * 1000 // 24 hours
}));
//https://access.redhat.com/documentation/en-us/red_hat_single_sign-on/7.0/html-single/securing_applications_and_services_guide/index#applicationclustering
var keycloak = new Keycloak({ cookies: true });
app.use( keycloak.middleware());
app.get( '/check-sso', keycloak.checkSso(), (req, res) => {
res.send('Check sso success');
});
app.get( '/protected', keycloak.protect(), (req, res) => {
res.send('Protected content visible to you, because you are authenticated!');
});
app.listen(3000, '0.0.0.0', () => {console.log('App listening on port 3000');});
Run Code Online (Sandbox Code Playgroud)
当我访问时localhost:3000/protected
,我被重定向到 KeyCloak 并且我可以成功进行身份验证。然后我被重定向到localhost:3000/protected
,创建 Cookie 并传递到服务器。
我在网上阅读了很多资料,这个 repo https://github.com/v-ladyev/keycloak-nodejs-example/blob/master/lib/keyCloakService.js是一个基于 cookie 的无状态解决方案,但它重新实现了keycloak-connect
.
keycloak-connect
如果可能的话,我宁愿选择一个可以直接插入的简单解决方案。
任何帮助表示赞赏。
归档时间: |
|
查看次数: |
1153 次 |
最近记录: |