微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何实现自定义委托令牌

如何解决如何实现自定义委托令牌

我有以下情况:

  • 我有一个HTTP服务,其中有一个具有密钥表和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,但这需要一个经过kerberized的环境。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。