命令行实用程序的 OAuth2 客户端服务器身份验证

Posted

技术标签:

【中文标题】命令行实用程序的 OAuth2 客户端服务器身份验证【英文标题】:OAuth2 client server authentication for a command line utility 【发布时间】:2015-07-12 13:17:09 【问题描述】:

我正在开发一个命令行实用程序,它需要通过 REST API 访问后端服务器。

我正在尝试避免实现自己的身份验证机制并使用一种(或多种)公共身份验证服务(如 google、Facebook、amazon)。

我正在尝试让客户端接受凭据并对身份验证提供程序进行身份验证,并在不要求用户打开 Web 浏览器并返回令牌的情况下执行此操作。客户端将开源以避免信任问题(即用户凭据不会发送到我的后端服务器)。

我对授权不感兴趣,我只关心对我的后端服务器进行身份验证,而不需要用户保留另一组凭据(并且不将用户凭据发送到我的后端服务器)。

如何让我的客户端通过身份验证提供程序进行身份验证并获得一个令牌以与我的服务器通信不让用户使用网络浏览器?

【问题讨论】:

旁注:“我试图避免实现自己的身份验证机制并使用一个(或多个)公共身份验证服务。”这是一个绝妙的主意。看好你。我不太明白为什么你需要进行身份验证,除非我误解了你在做什么。另一个旁注:“客户端将开源以避免信任问题”仍然存在零信任,因为谁说您正在运行的程序是您正在显示的源代码的程序?最终用户都知道,您在 prod 版本中有一些额外的恶意代码行 我需要身份验证的原因是因为服务器将公开,我只需要限制某些用户的访问。客户端很可能使用解释型语言,因此用户可以查看代码、从 github 下载代码甚至编写自己的客户端(鼓励这样做),因为与服务器的接口也将是开源的. 啊,所以我完全误解了你在做什么。那好吧。此外,可能会将一个文件返回给外部请求,而将另一个文件返回给内部请求,因此您的代码仍然可能是恶意的。 我不会将其作为“答案”发布,因为我发现这篇文章试图验证我的理解,但密码凭据流不正是您正在寻找的吗?跨度> 【参考方案1】:

我知道你说“不打开网络浏览器”,但如果该浏览器在另一台设备上(例如他们的手机?)。

如果可以接受,您可以使用OAuth 2.0 for Devices 方法,向用户显示一个简短的字母数字代码,用户在http://google.com/device 上输入该代码以验证来自另一台设备的请求。此 OAuth 流程旨在在没有浏览器的环境中工作(如命令行)。

要查看此身份验证流程的实际演示,请访问 YouTube TV 站点,按键盘上的 ← 键,然后选择登录。

自己尝试也很容易——在developers console(类型为“已安装的应用程序”->“其他”)中创建一个 OAuth 客户端,并按照文档中的curl 示例进行操作(请务必替换在令牌请求中演示 code 以及从初始请求到代码端点收到的 device_code)。使用任何示例 JWT 解码器解码生成的 id_token,例如 this one。

在您的情况下,您应该请求 profile 范围,这将在对您的令牌端点调用的响应中返回一个 id_token,您可以从中提取用户的 Google 个人资料 ID(ID 令牌的 sub 字段)。

【讨论】:

感谢您的建议。我查看了设备方法,但它不是我的首选——我仍然更喜欢用户可以在一个步骤中提供身份验证凭据的方法(这也适用于自动化环境)。如果我无法找到一种方法来做到这一点,那么我可以使用一种需要一次性操作来建立信任的方法(在这种情况下,浏览器或设备都可以接受),然后使用该令牌进行进一步的通信。 关于范围 - 如果我不想授权任何 G 服务,“配置文件”是最好的方法。个人资料 ID 是用户的电子邮件(还是我可以用作唯一令牌保存在我的用户数据库中的其他东西)? 正确,profile 是最好的范围,如果您只需要身份验证而不需要授权,如果您还想要用户的电子邮件地址,请添加 email 范围。您应该使用 ID Token 的 sub 字段作为唯一的 Google 用户标识符。 链接的 OAuth 2.0 for Devices 文档建议在可以访问浏览器的环境中运行的 CLI 程序改用 OAuth 2.0 for Mobile & Desktop Apps。

以上是关于命令行实用程序的 OAuth2 客户端服务器身份验证的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2 密码授予和基本身份验证

如何在 oauth2 身份验证之上实现用户权限

Grails 和 Spring Security & Facebook & Oauth2 - Restful 服务器

OAuth2用户详细信息未在春季安全(SpringBoot)中更新

开发一个基本的命令行实用程序来控制另一个进程[关闭]

Oauth2 身份验证失败