如何实现自定义委派令牌

4xy9mtcn  于 2021-05-27  发布在  Hadoop
关注(0)|答案(0)|浏览(331)

我有以下场景:
我有一个http服务,其中有一个登录的用户,有一个keytab和一个kerberos主体—为了这个示例,让我们命名这个用户 service_user 然后我有一个客户机,它调用这个服务并通过kerberos(spnego)对自己进行身份验证——让我们说出调用该服务的用户的名字 client_user 我想从我的服务中启动一个yarn java应用程序(它工作得非常好),最后从yarn容器中调用需要身份验证的服务回调端点
在yarn容器中,我不在kerberized环境中,我只有委托令牌
因此,理想情况下,我的服务也应该接受spnego和委托令牌身份验证
我看了一眼 DelegationTokenAuthenticationFilter ,但我不知道该怎么用。我把它添加到我的服务中,我看到了 DelegationTokenAuthenticationHandler#managementOperation 能处理我的请求 op=GETDELEGATIONTOKEN 在查询部分。如果我做了这样的事 curl --negotiate -u : http://host:port/callback?op= GETDELEGATIONTOKEN 从命令行我得到了一个委托令牌,这很好。
但那不是我想要的,对吗?我想做的是: client_user 调用我的服务,通过spnego对自己进行身份验证,该服务为 client_user ,将该委托令牌传递给yarn容器(我设置 HADOOP_TOKEN_FILE_LOCATION env变量),然后使用我创建的委托令牌从yarn容器回调到我的服务。
我还尝试以自己的方式创建委派令牌:

DelegationTokenManager tokenManager = new DelegationTokenManager(conf, new Text("..."));
tokenManager.init();
Token<? extends AbstractDelegationTokenIdentifier> token = tokenManager.createToken(ugi, renewer);
Credentials credentials = ...
credentials.addToken(new Text("..."), token);

然后我把它放在我的Yarn容器里:

import static org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticator.DELEGATION_TOKEN_HEADER;

UserGroupInformation currentUser = UserGroupInformation.getCurrentUser();
Credentials credentials = currentUser.getCredentials();
Token<? extends TokenIdentifier> delegationToken = credentials.getToken(new Text("..."));
HttpURLConnection connection = ...
connection.setRequestProperty(DELEGATION_TOKEN_HEADER, delegationToken.encodeToUrlString());

我看到了 DelegationTokenAuthenticationFilter 捡起我的令牌,但它说它无效。关于没有签字的事。
我走的路对吗?我应该忘记 DelegationTokenAuthenticationFilter 简单地扩展 AuthenticationFilter 在哪里可以接受http请求中的自定义委派令牌头?或者我应该使用 DelegationTokenAuthenticationFilter 并尝试覆盖 DelegationTokenManager#verifyToken 不知怎么的?
我发现在yarn容器中创建httpurlconnection可以使用 DelegationTokenAuthenticatedURL.openConnection 但这需要一个煤焦化的环境。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题