什么最适合与 CLI 工具的身份验证服务器交互?
What is best suited to interface with authentication servers for a CLI tool?
我正在开发两个 linux 程序,一个 CLI 客户端和一个通过 gRPC 通信的服务器,我现在想根据给定的私有授权服务器(如 LDAP、Active Directory 等)对用户进行身份验证
我对各种可能的身份验证流程感到困惑。我认为我不能使用任何经典流程,包括 HTTP 重定向,因为我不应该依赖于安装的浏览器或具有 Internet 访问权限。我什至无法定义我可以重定向到的端点(服务器没有互联网访问权限,并且都在 NAT 后面)。
所以我在考虑尝试将用户的凭据作为 JWT 令牌文件存储在用户的计算机中,然后从我的 CLI 客户端程序加载它以将其包含在我的 RPC 请求中,然后在服务器端验证它。但是,假设我是对的,那么获取此令牌文件的最佳标准方法是什么?
如果您有浏览器,则可以使用 OAuth 和 'oob'(带外)方法,其中 CLI 打开浏览器并在用户验证后显示一个数字,用户 copy/pastes进入 CLI。这就是我的 flickr backup CLI 的工作原理。他们 copy/paste 的号码是因为 CLI 没有 OAuth 端点,号码是他们的访问令牌,允许我代表他们调用 flickr api。
如果您不能使用浏览器,CLI 只能接受来自用户的 username/password,将其发送到服务器并在 return 中接收令牌。你真的不需要像 JWT 这样花哨的东西。一个简单的 UUID 就足够了。允许用户访问服务器其他 RPC 方法的 UUID 'asserts'。服务器将验证 UUID 令牌以确保它仍然有效。如果您需要令牌中的用户信息,服务器可以做到这一点。将用户信息保留在客户端磁盘之外,如果令牌仍然有效,则只有 CLI 可以访问该信息。
所以实际上,您需要一个新的服务器 RPC 方法,也许 authenticate
,它接受用户名和密码以及 return 一个 UUID 令牌。然后,所有其他 RPC 方法都需要接受该令牌并在执行请求的功能之前对其进行验证。作为服务器端身份验证过程的一部分,服务器可以将该令牌与其从 LDAP 服务器获得的用户信息相关联,因此您无需将该信息存储在客户端上。也可以让您在服务器上加密它,如果客户端需要它,它会使用 UUID 令牌请求它,如果它仍然有效(生存时间?)。如果不再有效,客户端只需要再次请求username/password,服务器就可以通过LDAP重新验证用户并刷新令牌和用户信息。
gRPC 有 authentication protocols 但 SSL/TLS 似乎不符合您的需求,并且 OAuth 将无法工作,因为您没有浏览器。因此,滚动您自己的简单令牌服务 (authenticate
) 与 LDAP 身份验证相结合可能是一个可行的选择。
我正在开发两个 linux 程序,一个 CLI 客户端和一个通过 gRPC 通信的服务器,我现在想根据给定的私有授权服务器(如 LDAP、Active Directory 等)对用户进行身份验证
我对各种可能的身份验证流程感到困惑。我认为我不能使用任何经典流程,包括 HTTP 重定向,因为我不应该依赖于安装的浏览器或具有 Internet 访问权限。我什至无法定义我可以重定向到的端点(服务器没有互联网访问权限,并且都在 NAT 后面)。
所以我在考虑尝试将用户的凭据作为 JWT 令牌文件存储在用户的计算机中,然后从我的 CLI 客户端程序加载它以将其包含在我的 RPC 请求中,然后在服务器端验证它。但是,假设我是对的,那么获取此令牌文件的最佳标准方法是什么?
如果您有浏览器,则可以使用 OAuth 和 'oob'(带外)方法,其中 CLI 打开浏览器并在用户验证后显示一个数字,用户 copy/pastes进入 CLI。这就是我的 flickr backup CLI 的工作原理。他们 copy/paste 的号码是因为 CLI 没有 OAuth 端点,号码是他们的访问令牌,允许我代表他们调用 flickr api。
如果您不能使用浏览器,CLI 只能接受来自用户的 username/password,将其发送到服务器并在 return 中接收令牌。你真的不需要像 JWT 这样花哨的东西。一个简单的 UUID 就足够了。允许用户访问服务器其他 RPC 方法的 UUID 'asserts'。服务器将验证 UUID 令牌以确保它仍然有效。如果您需要令牌中的用户信息,服务器可以做到这一点。将用户信息保留在客户端磁盘之外,如果令牌仍然有效,则只有 CLI 可以访问该信息。
所以实际上,您需要一个新的服务器 RPC 方法,也许 authenticate
,它接受用户名和密码以及 return 一个 UUID 令牌。然后,所有其他 RPC 方法都需要接受该令牌并在执行请求的功能之前对其进行验证。作为服务器端身份验证过程的一部分,服务器可以将该令牌与其从 LDAP 服务器获得的用户信息相关联,因此您无需将该信息存储在客户端上。也可以让您在服务器上加密它,如果客户端需要它,它会使用 UUID 令牌请求它,如果它仍然有效(生存时间?)。如果不再有效,客户端只需要再次请求username/password,服务器就可以通过LDAP重新验证用户并刷新令牌和用户信息。
gRPC 有 authentication protocols 但 SSL/TLS 似乎不符合您的需求,并且 OAuth 将无法工作,因为您没有浏览器。因此,滚动您自己的简单令牌服务 (authenticate
) 与 LDAP 身份验证相结合可能是一个可行的选择。