authentication - 我应该如何为 Electron 桌面应用程序实现用户身份验证/角色?

标签 authentication oauth-2.0 electron openid-connect desktop-application

我正在为一个大学项目设计架构,但我不知道如何处理其中的用户身份验证和授权部分。该项目是一个桌面 Electron 应用程序,需要两种类型的用户(因此是角色)。他们都需要经过身份验证才能使用该应用程序,并且根据他们的身份,他们将拥有不同的授权。由于该项目是为了让教师和学生在完成后作为实验课的一部分使用,所以我认为不会超过 30 人同时使用它。
我的第一个想法是为此使用 AWS 中的 PostrgeSQL 数据库并自己实现身份验证,但这意味着用户必须注册并创建一个新配置文件 这意味着记住另一个<用户名/Electron 邮件,密码> .为了避免这种情况,我读了一些关于 的文章。 OAuth 2.0 和 OIDC ,以及如何使用它来对用户进行身份验证和授权,而无需自己执行其中任何一项任务,而是将任务委托(delegate)给 OIDC。我用 Auth0 创建了一个免费帐户并考虑将其用于 OIDC 集成,但在阅读了大约 40 页他们免费提供的“OIDC 集成手册”后,我不知道我是否能够通过我提到的这些角色或标签来区分我的用户群。我只是按照教程手册中的步骤操作,并试图了解身份验证流程是如何工作的,但这并没有给我任何关于我的问题的信息。
所以总而言之,我想知道的是:是否可以使用 Auth0(免费帐户)来实现这一点,而不必使用第三方数据库解决方案(例如 PostgreSQL 和 AWS)?如果没有,你会建议我研究什么?最好的解决方案可以让我区分两种类型的用户,但同时利用 Google 的 OIDC 实现,例如 .

最佳答案

这里有2个单独的解决方案:
桌面认证
2个标准要求是:

  • 使用授权码流程 (PKCE)
  • 通过系统浏览器登录

  • 您通过以下机制之一收听登录响应(我更喜欢后者):
  • 环回网络服务器
  • 私有(private) URI 方案 OS 通知

  • 我的博客有一些 tutorials + code samples使用 Electron 。您可以运行上述两个聆听选项,看看您喜欢什么。
    API 授权与角色
    您需要通过声明使角色对 API 可用。这可以通过以下任何一种机制来完成(我更喜欢后者):
  • 通过 Auth0
  • 在访问 token 中包含角色
  • 获取 API 以从自己的数据库中读取用户角色

  • 我的 Authorization blog post讨论以易于扩展的方式构建声明对象。主要目标通常是让 API OAuth 处理产生如下对象:
    class UserPrincipal {
    
      // The technical user id from the access token 
      string sub;
    
      // The user id from your own database
      string userId;
    
      // The user's roles
      string[] roles;
    
    }
    
    鉴于该对象,您可以执行以下操作:
  • 需要时使用基于角色的授权
  • 从您的应用程序数据登录后提供用户资源

  • 总结
    Auth0 将满足您的一些要求,并且可能是您早期所需要的。不过,您可能需要在某个时候在您的 API 中管理非 OAuth 用户数据。
    很高兴回答任何后续问题..

    关于authentication - 我应该如何为 Electron 桌面应用程序实现用户身份验证/角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63555126/

    相关文章:

    azure - MS Graph 用户 ID 和 Azure AD 对象标识符声明是否等效?

    java - spring-security-oauth2中OAuth2的refresh_token逻辑实现

    java - 为网站创建 API

    javascript - Cypress - 重新连接到 Chrome DevTools 协议(protocol)时出错

    ruby-on-rails - Rails 3 + 设计 - 电子邮件 + 用户创建

    c# - ReactJs + Webapi 如何做外部认证?

    authentication - 在同一域中的多个站点上进行单点登录

    javascript - 在 Electron 上显示和隐藏主窗口

    angularjs - angular1 与 Electron : ng-dblclick not working

    c++ - C++ 中的 Windows LDAP 身份验证