我是Keycloak的新手,并且很难验证用Electron编写的桌面应用程序。我查看了讨论OpenID Connect endpoint的文档,然后发现了一个遍历Keycloak and Postman的博客,并且可以通过此方法从Keycloak获取令牌。
我很确定这是不正确的,原因有几个。
如何在不运行客户端Web服务器来处理重定向的情况下认证我的Electron应用程序?有一个example for authenticating a web app,但没有人有一个简单的示例说明如何针对Keycloak验证Electron应用程序吗?
答案 0 :(得分:0)
import Keycloak from 'keycloak-js';
if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {
// don't need keycloak in development mode, change the condition to if (false) to force keycloak to be required locally
} else {
keycloak.init({ onLoad: 'login-required', checkLoginIframeInterval: 1 }).success((authenticated) => {
if (authenticated) {
sessionStorage.setItem('kctoken', keycloak.token);
setInterval(() => {
keycloak.updateToken(10).error(() => keycloak.logout());
sessionStorage.setItem('kctoken', keycloak.token);
}, 10000);
} else {
keycloak.login();
}
});
}
尝试一下,然后回发谢谢:)
答案 1 :(得分:0)
最后,我设法用Electron应用程序实现了Keycloak身份验证。事情是从应用程序的主进程派生一个临时的http服务器。成功登录Keycloak后,该服务器应侦听重定向请求。当然,要使其正常工作,您应该在Keycloak客户端的 *有效重定向URI 输入中指定该服务器的地址,例如http://localhost:33333
。当请求到达服务器时,您将对其进行解析并提取请求的“搜索”部分。然后,将此“搜索”部分附加到index.html路径并从中加载mainWindow:
const url = `file://${path.join(__dirname, '../index.html')}${searchString}`;
mainWindow.loadURL(url);
对我有益。
PS。我可以根据要求提供带有示例代码的详细解决方案。
答案 2 :(得分:0)
要在构建Electron中使用Keycloak,必须在main.js中添加服务器侦听器:
const Keycloak = http.createServer((request, response) => {
response.writeHeader(200, {"Content-Type": "text/html"});
var readSream = fs.createReadStream(__static + '/index.html','utf8')
readSream.pipe(response);
});
Keycloak.listen(3000);
接下来将文件index.html
添加到文件夹__static
。在此文件中,像在instruction中一样,添加JS脚本。
并且您必须添加ipcRenderer
并将令牌发送到main.js:
keycloak.init({ onLoad: 'login-required', redirectUri: 'http://localhost:3000' }).success(function(authenticated) {
if (authenticated) {
ipcRenderer.send('keycloak-token', keycloak.token);
}
}).error(function() {
console.log('error');
});
请记住在http://localhost:3000
的Keycloak设置中添加redirectUri
。
接下来在main.js
中,您可以发送令牌以检查授权状态:
ipcMain.on('keycloak-token', (event, token) => {
const winURL = process.env.NODE_ENV === 'development'
? `http://localhost:9080?token=${token}`
: `file://${__dirname}/index.html?token=${token}`
mainWindow.loadURL(winURL);
});