如何解决如何实现自定义委托令牌
我有以下情况:
- 我有一个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 举报,一经查实,本站将立刻删除。