我有以下情况:
service_user
client_user
我看过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的环境。