什么最适合用于管理命令行工具的身份验证服务器接口?

3
我正在开发两个Linux程序,一个CLI客户端和一个通过gRPC进行通信的服务器,并且我现在想要对用户进行身份验证,以便通过给定的私有授权服务器(例如LDAP,Active Directory等)进行通信。然而,我对可能的各种身份验证流程感到困惑。我认为我不能使用任何包括HTTP重定向的经典流程,因为我不应该依赖于安装浏览器或具有互联网访问权限。我甚至无法定义一个可重定向的端点(服务器没有互联网访问权限,并且两者都在NAT之后)。所以我考虑尝试将用户凭据作为JWT令牌文件存储在用户的计算机中,然后从我的CLI客户端程序中加载它以包含在我的RPC请求中,然后在服务器端进行验证。但是,假设我是正确的,那么获取此令牌文件的最佳标准方法是什么?

CLI的用户是否需要输入他们的用户名/密码,然后服务器使用您的LDAP服务器验证这些凭据? - codebrane
1个回答

2
如果您使用浏览器,您可以使用OAuth和“oob”(带外)方法,其中CLI打开浏览器,用户验证后显示一个数字,用户将其复制/粘贴到CLI中。这就是我的 flickr backup CLI 的工作方式。他们复制/粘贴的数字是因为CLI没有OAuth端点,该数字是他们的访问令牌,允许我代表他们调用flickr api。
如果您无法使用浏览器,CLI只需接受用户的用户名/密码,将其发送到服务器并返回令牌即可。您实际上不需要像JWT那样的高级功能。一个简单的UUID就足够了。 UUID“断言”用户有权访问服务器的其他RPC方法。服务器将验证UUID令牌以确保其仍然有效。如果您需要从令牌获取用户信息,则服务器可以执行此操作。将用户信息保存在客户端磁盘之外,只有CLI可以访问该信息(如果令牌仍然有效)。
因此,实际上你需要一个新的服务器RPC方法,可能是authenticate,它接受用户名和密码并返回UUID令牌。然后,在执行请求的功能之前,所有其他RPC方法都需要接受并验证该令牌。作为服务器端身份验证过程的一部分,服务器可以将该令牌与它从LDAP服务器获取的用户信息相关联,因此你不需要在客户端上存储该信息。还可以在服务器上加密它,如果客户端需要它,它会使用UUID令牌询问它是否仍然有效(存活时间?)。如果它不再有效,客户端只需重新请求用户名/密码,服务器可以通过LDAP重新验证用户并刷新令牌和用户信息。

gRPC有身份验证协议,但SSL/TLS似乎不符合你的需求,OAuth也行不通,因为没有浏览器。因此,结合LDAP身份验证,自己编写简单的令牌服务(authenticate)可能是一个可行的选项。


这听起来就像 Azure CLI 的工作方式,它们让你通过加载一个 URL 并输入 CLI 提供的令牌来登录。 - BookOfGreg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接