认证 请求/响应 封装/完善
This commit is contained in:
parent
d875a90fd6
commit
296747ec31
@ -44,10 +44,10 @@ public class RegisterRequestBuilder extends RegisterBuilder {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public Request createAuthorizationRequest(String callId, int expires, String id, String passwd, WWWAuthenticateHeader wwwAuthenticateHeader) {
|
||||
public Request createAuthorizationRequest(String callId, int expires, String id, String passwd, long cSeq, WWWAuthenticateHeader wwwAuthenticateHeader) {
|
||||
SIPRequest request = (SIPRequest) createNoAuthorizationRequest(callId, expires);
|
||||
request.getCSeq().setSeqNumber(2L);
|
||||
AuthorizationHeader authorization = DigestAuthenticationHelper.createAuthorization(getMethod(), getTargetIp(), getTargetPort(), getTargetId(), id, passwd, wwwAuthenticateHeader);
|
||||
request.getCSeq().setSeqNumber(cSeq + 1);
|
||||
AuthorizationHeader authorization = DigestAuthenticationHelper.createAuthorization(getMethod(), getTargetIp(), getTargetPort(), getTargetId(), id, passwd, (int) cSeq,wwwAuthenticateHeader);
|
||||
return SipBuilder.addHeaders(request,authorization);
|
||||
}
|
||||
}
|
||||
|
@ -7,9 +7,7 @@ import cn.skcks.docking.gb28181.sip.utils.DigestAuthenticationHelper;
|
||||
import cn.skcks.docking.gb28181.sip.utils.SipUtil;
|
||||
import gov.nist.javax.sip.header.Authorization;
|
||||
import gov.nist.javax.sip.message.SIPRequest;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import lombok.*;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -41,12 +39,12 @@ public class RegisterResponseBuilder extends RegisterBuilder {
|
||||
sipRequest.getExpires());
|
||||
}
|
||||
|
||||
public Response createAuthorzatioinResponse(Request request, String password){
|
||||
public Response createAuthorzatioinResponse(Request request, String domain, String password){
|
||||
SIPRequest sipRequest = (SIPRequest) request;
|
||||
Authorization authorization = sipRequest.getAuthorization();
|
||||
if(authorization == null){
|
||||
String realm = SipUtil.nanoId();
|
||||
WWWAuthenticateHeader wwwAuthenticateHeader = DigestAuthenticationHelper.generateChallenge(realm);
|
||||
WWWAuthenticateHeader wwwAuthenticateHeader = DigestAuthenticationHelper.generateChallenge(domain);
|
||||
return SipBuilder.addHeaders(
|
||||
SipResponseBuilder.createResponse(Response.UNAUTHORIZED, request),
|
||||
sipRequest.getContactHeader(),
|
||||
@ -55,7 +53,7 @@ public class RegisterResponseBuilder extends RegisterBuilder {
|
||||
boolean passed = DigestAuthenticationHelper.doAuthenticatePlainTextPassword(request,password);
|
||||
if(!passed){
|
||||
sipRequest.removeHeader(Authorization.NAME);
|
||||
return createAuthorzatioinResponse(request, password);
|
||||
return createAuthorzatioinResponse(request, domain, password);
|
||||
}
|
||||
return SipBuilder.addHeaders(
|
||||
SipResponseBuilder.createResponse(Response.OK, request),
|
||||
|
@ -219,7 +219,7 @@ public class DigestAuthenticationHelper {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static AuthorizationHeader createAuthorization(String method,String serverIp, int serverPort, String serverId, String deviceId,String password, WWWAuthenticateHeader www){
|
||||
public static AuthorizationHeader createAuthorization(String method,String serverIp, int serverPort, String serverId, String deviceId,String password, int nonceCount, WWWAuthenticateHeader www){
|
||||
String hostAddress = SipBuilder.createHostAddress(serverIp, serverPort);
|
||||
SipURI sipURI = SipBuilder.createSipURI(serverId, hostAddress);
|
||||
if (www == null) {
|
||||
@ -235,8 +235,7 @@ public class DigestAuthenticationHelper {
|
||||
String qop = www.getQop();
|
||||
|
||||
String cNonce = null;
|
||||
int nc = 1;
|
||||
String ncStr = String.format("%08x", nc).toUpperCase();
|
||||
String ncStr = String.format("%08x", nonceCount).toUpperCase();
|
||||
if (qop != null) {
|
||||
if ("auth".equalsIgnoreCase(qop)) {
|
||||
// 客户端随机数,这是一个不透明的字符串值,由客户端提供,并且客户端和服务器都会使用,以避免用明文文本。
|
||||
@ -277,7 +276,7 @@ public class DigestAuthenticationHelper {
|
||||
if (qop != null) {
|
||||
authorizationHeader.setQop(qop);
|
||||
authorizationHeader.setCNonce(cNonce);
|
||||
authorizationHeader.setNonceCount(nc);
|
||||
authorizationHeader.setNonceCount(nonceCount);
|
||||
}
|
||||
return authorizationHeader;
|
||||
}
|
||||
|
@ -23,6 +23,8 @@ public class RequestTest {
|
||||
int remotePort = 5060;
|
||||
String remoteId = "00000000000000000002";
|
||||
|
||||
public static final String domain = "4405010000";
|
||||
|
||||
@Test
|
||||
@SneakyThrows
|
||||
void test() {
|
||||
@ -55,16 +57,17 @@ public class RequestTest {
|
||||
log.info("\n{}", passedAuthorzatioinResponse);
|
||||
|
||||
log.info("有密码的认证");
|
||||
Response authorzatioinResponse = registerResponseBuilder.createAuthorzatioinResponse(noAuthorizationRequest, "123456");
|
||||
Response authorzatioinResponse = registerResponseBuilder.createAuthorzatioinResponse(noAuthorizationRequest, domain, "123456");
|
||||
log.info("\n{}", noAuthorizationRequest);
|
||||
// 401 响应
|
||||
log.info("\n{}", authorzatioinResponse);
|
||||
SIPResponse sipResponse = (SIPResponse)authorzatioinResponse;
|
||||
WWWAuthenticateHeader wwwAuthenticateHeader = (WWWAuthenticateHeader)sipResponse.getHeader(WWWAuthenticateHeader.NAME);
|
||||
SIPResponse sipResponse = (SIPResponse) authorzatioinResponse;
|
||||
WWWAuthenticateHeader wwwAuthenticateHeader = (WWWAuthenticateHeader) sipResponse.getHeader(WWWAuthenticateHeader.NAME);
|
||||
long cSeq = sipResponse.getCSeq().getSeqNumber();
|
||||
// 重新发起带有认证信息的请求
|
||||
Request authorizationRequest = registerRequestBuilder.createAuthorizationRequest(callId, 3600, localId, "123456", wwwAuthenticateHeader);
|
||||
Request authorizationRequest = registerRequestBuilder.createAuthorizationRequest(callId, 3600, localId, "123456", cSeq, wwwAuthenticateHeader);
|
||||
log.info("\n{}", authorizationRequest);
|
||||
authorzatioinResponse = registerResponseBuilder.createAuthorzatioinResponse(authorizationRequest, "123456");
|
||||
authorzatioinResponse = registerResponseBuilder.createAuthorzatioinResponse(authorizationRequest, domain, "123456");
|
||||
// 注册成功
|
||||
log.info("\n{}", authorzatioinResponse);
|
||||
}
|
||||
|
@ -17,13 +17,13 @@ public class AuthenticationTest {
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
AuthorizationHeader authorization = DigestAuthenticationHelper.createAuthorization(Request.REGISTER, serverIp, serverPort, serverId, deviceId, "123456", null);
|
||||
AuthorizationHeader authorization = DigestAuthenticationHelper.createAuthorization(Request.REGISTER, serverIp, serverPort, serverId, deviceId, "123456", 1,null);
|
||||
log.info("\n{}", authorization);
|
||||
|
||||
WWWAuthenticateHeader wwwAuthenticateHeader = DigestAuthenticationHelper.generateChallenge(domain);
|
||||
log.info("\n{}", wwwAuthenticateHeader);
|
||||
|
||||
authorization = DigestAuthenticationHelper.createAuthorization(Request.REGISTER, serverIp, serverPort, serverId, deviceId, "123456", wwwAuthenticateHeader);
|
||||
authorization = DigestAuthenticationHelper.createAuthorization(Request.REGISTER, serverIp, serverPort, serverId, deviceId, "123456", 1, wwwAuthenticateHeader);
|
||||
log.info("\n{}", authorization);
|
||||
|
||||
boolean passed = DigestAuthenticationHelper.doAuthenticatePlainTextPassword(Request.REGISTER, authorization, "123456");
|
||||
|
Loading…
Reference in New Issue
Block a user