【问题标题】:3rd party User Auth with Electron使用 Electron 的 3rd 方用户身份验证
【发布时间】:2017-02-24 12:08:19
【问题描述】:

我一直在寻找有关如何在 Electron 应用中实现用户身份验证的资源。

我想利用 Github 等第三方服务来允许用户登录和注册。对于“常规”Node.js 应用程序,我可能会使用类似 passport.js 或类似的东西来实现它。

我的困惑是因为 Electron 应用程序是客户端的,所以在客户端代码中包含诸如客户端密钥之类的东西似乎是错误的。那么在 Electron 应用中实现 3rd 方用户身份验证的过程是怎样的呢?

【问题讨论】:

  • 到目前为止,您必须在客户端拥有您的客户端密钥,是的,这确实是错误的,但目前似乎就是这样。

标签: node.js authentication oauth-2.0 electron


【解决方案1】:

将电子应用程序视为标准浏览器页面。 然后您将拥有标准的 oauth2 流程。

首先,您需要中间件服务器,您将在其中存储用于第三方服务的 clientId 和 clientSecret。

您需要在电子应用程序和中间件服务器之间创建类似会话的东西(下面我将展示示例)。

下面我将展示授权github的示例过程。

你需要使用 https。

假设您的中间件服务器在 example.com 上可用。您至少需要两个端点:

  1. 获取:https://example.com/initAuth/
  2. 获取:https://example.com/oauth/token

Github client_id 和 client_secret 只存储在这个服务器中。

您的电子应用程序将 GET 请求发送到 https://example.com/initAuth/。 你的服务器应该生成两个 uuid。应该存储为对(例如在 redis 中)。一个 uuid 用于授权 github 链接中的 state 参数,第二个作为简单的会话/令牌来识别您的电子应用程序。 您的服务器应该构建 url 到 github 访问 github access GET https://github.com/login/oauth/authorize

  1. redirect_uri 将是您的第二个端点 - https://example.com/oauth/token
  2. state 将是你的第一个 uuid
  3. 其他参数照常。

现在您从这个端点返回到电子会话/令牌 uuid 和构建的 url。

您的电子节目链接与 target="_blank" - 它应该在单独的选项卡/窗口中打开。 Electron 应该记住 session/token uuid。

当用户单击链接时,他将进入接受您的应用程序的 oauth 进程。然后他会被重定向到你的中间件服务器第二个端点(https://example.com/oauth/token

您的服务器将进入此端点codestate。你的服务器应该检查它是否已经用这个state 注册了电子应用程序。如果它存在,那么服务器需要将codeclient_secret 交换为access_token(我不会解释它——这是标准的oauth 流程)。 现在将其存储在临时存储 (redis) access_token 和两个 uuid 中。 并且作为响应呈现带有脚本的 html 视图,该脚本将关闭此选项卡或只是带有一些消息的普通 html 视图。

您的电子应用需要知道中间件服务器是否有 access_token。

  1. Electron 可以通过发送到第三端点会话/令牌 uuid 来轮询中间件服务器。如果有 access_token 服务器会返回它。
  2. 您可以使用 websockets
  3. 您的主窗口可以检查第二个“oauth”窗口是否关闭,然后向中间件服务器发送访问令牌请求。

或者,您也可以将 access_token 存储在中间件服务器中,您的电子不会向 github 发送请求,而只会向您的服务器发送请求,您的服务器会将请求发送到 github,然后响应返回给电子。

【讨论】:

  • 非常明确的答案。但有一件事我不明白:一旦用户通过您的中间件服务器授予对 GitHub 的访问权限,中间件服务器现在不是容易受到攻击吗?例如。如果同一用户导航到恶意网站,该网站对您的中间件服务器进行 JavaScript 调用,它不能获取 GitHub 令牌并访问用户的帐户吗?我认为 CORS 在这里甚至没有帮助,因为中间件服务器必须允许通配符来源才能让电子应用程序调用它。
  • 谢谢。请检查最后一段。它显示了更安全的方法。首先,没有办法从中间件获取 github 访问令牌。中间件没有返回它的方法。中间件根据收到的来自 electron 的请求向 github 发出请求。在最坏的情况下,恶意代码可能会欺骗中间件来执行某些定义的操作。但它不应该发生,因为只有当电子发送请求会话 uuid 时,中间件才会执行操作。
  • 但是中间件怎么知道是电子应用程序在初始化会话而不是其他恶意应用程序呢?我一定是错过了什么。
  • 你永远不能信任你的前端应用程序(在这种情况下是电子)。您永远无法确定现在呼叫来自您的应用程序。如果不同的应用程序正确执行所有操作,那么它应该得到相同的正确结果。但是这个结果应该只影响一个使用它的用户。没有别人了。如果有人使用您的应用程序的黑客版本,那么在最坏的情况下,他将受到影响。您需要提供您的应用程序的可信来源(例如 google、mac windows 合法商店)。如果客户使用的是您的应用程序的正确/合法版本并且他进行了身份验证,那么他的凭据应该是安全的,不会受到攻击。
  • 如果您有更多自定义案例,也许您应该更详细地描述它,也许我们会想办法
猜你喜欢
  • 2012-12-09
  • 2020-05-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2011-11-25
  • 2011-07-30
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多