我有以下场景:
我有一个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
但这需要一个煤焦化的环境。
暂无答案!
目前还没有任何答案,快来回答吧!