我正在开发两个Linux程序,一个CLI客户端和一个通过gRPC进行通信的服务器,现在我想根据给定的私有授权服务器(如LDAP,Active Directory等)对用户进行身份验证。
我对各种可能的身份验证流程感到困惑。我认为我不能使用任何经典流程,包括HTTP重定向,因为我不应该依赖于安装的浏览器或具有互联网访问权限。我甚至无法定义一个我可以重定向到的端点(服务器无法访问互联网,并且两者都在NAT之后)。
所以我考虑尝试将用户的凭据存储为用户计算机中的JWT令牌文件,然后从我的CLI客户端程序加载它以将其包含在我的RPC请求中,然后验证它在服务器端。但是,假设我是对的,那么获取此令牌文件的最佳标准方法是什么?
答案 0 :(得分:2)
如果您有浏览器,则可以使用OAuth和CLI打开浏览器的“oob”(带外)方法,在用户进行身份验证后,会显示用户复制/粘贴到CLI中的编号。这就是我flickr backup CLI的工作原理。他们复制/粘贴的数量是因为CLI没有OAuth端点,而且该号码是他们的访问令牌,允许我代表他们调用flickr api。
如果您无法使用浏览器,CLI只能接受用户的用户名/密码,将其发送到服务器并接收令牌。你真的不需要像JWT那样的任何东西。一个简单的UUID就足够了。 UUID'断言'允许用户访问服务器的其他RPC方法。服务器将验证UUID令牌以确保它仍然有效。如果您需要来自令牌的用户信息,则服务器可以执行此操作。如果令牌仍然有效,则将用户信息保留在客户端磁盘上,只有CLI才能访问该信息。
因此,实际上,您需要一个新的服务器RPC方法,可能是authenticate
,它接受用户名和密码并返回一个UUID令牌。然后,所有其他RPC方法都需要接受该令牌并在执行所请求的函数之前对其进行验证。作为服务器端身份验证过程的一部分,服务器可以将该令牌与从LDAP服务器获取的用户信息相关联,因此您无需在客户端上存储该信息。允许您在服务器上加密它,如果客户端需要它,它会使用UUID令牌请求它,如果它仍然有效(生存时间?)。如果它不再有效,客户端只需要再次询问用户名/密码,服务器可以通过LDAP重新验证用户身份并刷新令牌和用户信息。
gRPC有authentication protocols但SSL / TLS似乎不符合您的需求,OAuth无法正常运行,因为您没有浏览器。因此,将您自己的简单令牌服务(authenticate
)与LDAP身份验证相结合可能是一个可行的选择。