Rest OAuth-磁盘上要存储的内容

Rest OAuth-磁盘上要存储的内容,rest,oauth,google-oauth,desktop-application,Rest,Oauth,Google Oauth,Desktop Application,TL;DR在桌面应用程序上使用google oauth时,应在磁盘上保存哪些内容以避免重复登录?保存谷歌用户id?还是代币?还是会话id 我正在创建一个小型桌面应用程序,whitch必须通过我的RESTAPI服务器的身份验证。我正在使用谷歌oauth2 其想法是,当桌面应用程序将被授权时,它将生成一些数据,这些数据将被发送到我的服务器。服务器将使用从https://www.googleapis.com/userinfo/v2/me 在第一次运行桌面应用程序时,它将打开默认浏览器,其中包含“我的服

TL;DR在桌面应用程序上使用google oauth时,应在磁盘上保存哪些内容以避免重复登录?保存谷歌用户id?还是代币?还是会话id

我正在创建一个小型桌面应用程序,whitch必须通过我的RESTAPI服务器的身份验证。我正在使用谷歌oauth2

其想法是,当桌面应用程序将被授权时,它将生成一些数据,这些数据将被发送到我的服务器。服务器将使用从
https://www.googleapis.com/userinfo/v2/me

在第一次运行桌面应用程序时,它将打开默认浏览器,其中包含“我的服务器”的名称和url,并启动本地http服务器。然后:

  • 我的服务器将把浏览器重定向到谷歌(带有clientid、secret等)
  • 用户登录后,将使用oauth代码将其重定向回服务器
  • 服务器使用代码获取令牌,然后获取用户配置文件,并将令牌和配置文件存储在数据库中,然后使用参数将浏览器重定向到localhost
  • 桌面应用程序捕获参数并将其存储在磁盘上的文件中
  • 下次桌面应用程序启动时,它只读取参数文件,将生成的数据发送到我的服务器

    我的问题是:参数应该是什么?谷歌用户id?oauth令牌?为此桌面应用程序生成的会话id?还是别的什么

    • 当它是google用户id时,它可以方便地发送带有用户id的数据,rest服务器只会按原样将其存储在db中。但我认为这不安全
    • 当它成为令牌时,rest服务器必须处理每个请求,并使用令牌从google获取用户配置文件。而且,在每个请求中发送令牌也不安全
    • 生成会话id意味着将其与用户和令牌一起存储在服务器上,桌面应用程序只会存储它并在每次请求时发送它。但我不知道这样做是否安全

    发送每个请求的
    access\u令牌应该没有问题,因为它们是为此目的创建的,因此寿命很短。您可以使用而不是使用它来请求用户配置文件。

    如果您仅依赖Google进行身份验证,以下是您的工作流的外观:

  • 客户端(在您的情况下是桌面应用程序)检索 谷歌
    id\u令牌
    在用户登录后发送给 服务器
  • 服务器验证所述令牌的完整性并提取用户的简档数据;这可能意味着在谷歌的端点上进行一次简单的访问,以验证这个令牌:
    https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}

  • 在后续的请求中,除了用户的登录过程将被自动化(因为他被授予了权限&all)之外,什么都不应该改变,因此速度会快得多@danielx是对的,每次发送令牌都没有问题。

    在软件开发中,通常情况下,根据需求,您有两种选择

    强制性要求是,您的客户端(桌面)应用程序需要向REST API发送一些内容,以便该API最多可以执行两个决策:

  • 决定用户是谁
  • 决定用户是否有权执行当前请求的操作
  • 如果所有经过身份验证的用户都可以访问完全相同的操作集,那么第二步可能不适用,因此我将介绍这两种情况

    还请注意,对于第一步,发送Google用户ID不是一个有效的选项,因为该信息可以由其他方获得,并且不能确保用户通过身份验证使用您的应用程序

    选项1-无细粒度授权的身份验证 始终发送
    id\u令牌
    或将该令牌与自定义会话标识符交换都符合前面的要求,因为
    id\u令牌
    包含一个受众,该受众清楚地指示通过身份验证使用您的应用程序的用户,并且会话标识符由您的应用程序生成,因此它还可以确保。对API的请求需要使用HTTPS,否则攻击者很容易捕获令牌或会话ID

    如果使用
    id\u令牌
    替代方案,则需要考虑令牌将过期;为此,我们再次提供了一些选项:

    • 再次重复验证过程;如果用户仍然有一个会话,它确实会更快,但您仍然需要打开浏览器、本地服务器并重复整个步骤
    • 在执行第一次身份验证时请求脱机访问
    使用最后一个选项,您应该获得一个允许应用程序在第一个
    id\u令牌过期后仍能识别用户的方法。我说应该,因为谷歌做的事情似乎与规范有点不同,例如,获取刷新令牌的方法是通过而不是通过

    就我个人而言,我会使用会话标识符,因为您将对生命周期有更多的控制,而且可能会更简单

    选项2-身份验证+细粒度授权 如果您的RESTAPI需要细粒度的授权系统,那么最好的方法是使用Google对您的用户进行身份验证,然后使用符合OAuth 2.0的授权服务器,该服务器将为您的API颁发特定的访问令牌

    对于授权服务器实现,您可以:

    • 自己实现或利用开源组件
      可能非常耗时、复杂,安全风险的缓解都将落在您身上

    • 使用第三方OAuth 2.0作为服务授权提供程序,如
      易于启动,具体取决于使用量(Auth0上的免费计划)