Rest OAuth-磁盘上要存储的内容
TL;DR在桌面应用程序上使用google oauth时,应在磁盘上保存哪些内容以避免重复登录?保存谷歌用户id?还是代币?还是会话id 我正在创建一个小型桌面应用程序,whitch必须通过我的RESTAPI服务器的身份验证。我正在使用谷歌oauth2 其想法是,当桌面应用程序将被授权时,它将生成一些数据,这些数据将被发送到我的服务器。服务器将使用从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 在第一次运行桌面应用程序时,它将打开默认浏览器,其中包含“我的服
https://www.googleapis.com/userinfo/v2/me
在第一次运行桌面应用程序时,它将打开默认浏览器,其中包含“我的服务器”的名称和url,并启动本地http服务器。然后:
- 当它是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上的免费计划)