使用Keycloak保护电子应用程序

时间:2018-08-13 20:36:59

标签: node.js electron keycloak

我是Keycloak的新手,并且很难验证用Electron编写的桌面应用程序。我查看了讨论OpenID Connect endpoint的文档,然后发现了一个遍历Keycloak and Postman的博客,并且可以通过此方法从Keycloak获取令牌。

我很确定这是不正确的,原因有几个。

如何在不运行客户端Web服务器来处理重定向的情况下认证我的Electron应用程序?有一个example for authenticating a web app,但没有人有一个简单的示例说明如何针对Keycloak验证Electron应用程序吗?

3 个答案:

答案 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);
  });