BasicNettyHttpAuthenticator just appends the auth header to an every request.
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpClientCodec());
p.addLast(new HttpObjectAggregator(1048576));
p.addLast(new BasicNettyHttpAuthenticator("scott", "tiger"));
p.addLast(new HttpClientHandler());
}
});DigestAuthenticator digestAuthenticator = new DigestAuthenticator("scott", "tiger");
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpClientCodec());
p.addLast(new DigestNettyHttpAuthenticator(digestAuthenticator));
p.addLast(new HttpClientHandler());
}
});
...
ch.writeAndFlush(firstSequest); // the first request got 401 error
ch.writeAndFlush(secondRequest); // the second will succeeded if credentinals are not wrongThis is the tricky one. It works only with aggregated HTTP messages: FullHttpRequest and FullHttpResponse and keep-alive connection.
The solution that fits for RTSP.
TransparentDigestNettyHttpAuthenticator must be initialized with username and password and placed in a channel pipeline between HttpObjectAggregator
and handler that processes server responses, like this:
DigestAuthenticator digestAuthenticator = new DigestAuthenticator("scott", "tiger");
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpClientCodec());
p.addLast(new HttpObjectAggregator(1048576)); // NB! works only with aggregated request/response
p.addLast(new TransparentDigestNettyHttpAuthenticator(authenticator));
p.addLast(new HttpClientHandler());
}
});
..
ch.writeAndFlush(request); // the first attempt will succeeded if credentinals are not wrongTransparentDigestNettyHttpAuthenticator intercepts the client request, and remembers it
- If a server returns the
401 Unathorizederror, authenticator resends the request with proper authorization header - If a server returns
200 OK, authenticator attaches the authorization header to all subsequent requests - If a server returns the
401 Unathorizederror again, andstale=false, authenticator pass that error to client (bad credentials) - If a server returns the
401 Unathorized errorandstale=true, authenticator generates a new client nonce and resend the request with new authorization header
Typical client-server exchange may look like this:
Add the following dependency section to your pom.xml:
<dependency>
<groupId>io.github.vzhn</groupId>
<artifactId>netty-http-authenticator</artifactId>
<version>1.1</version>
</dependency>Make your changes, and submit a pull request. Contributions are welcome!
This project is licensed under the MIT License - see the LICENSE.md file for details
