Skip to content

Commit

Permalink
Merge pull request #14 from fileme/master
Browse files Browse the repository at this point in the history
Added a signer for Spring HTTP requests
  • Loading branch information
jaaufauvre committed Aug 13, 2019
2 parents 8b4fe41 + 923d729 commit 2472de1
Show file tree
Hide file tree
Showing 3 changed files with 210 additions and 0 deletions.
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<name>oauth1-signer</name>

<properties>
<spring-version>5.1.9.RELEASE</spring-version>
<okhttp2-version>2.7.5</okhttp2-version>
<okhttp3-version>3.12.0</okhttp3-version>
<google-api-client-version>1.23.0</google-api-client-version>
Expand Down Expand Up @@ -53,6 +54,13 @@
</distributionManagement>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.mastercard.developer.signers;

import com.mastercard.developer.oauth.OAuth;

import java.nio.charset.Charset;
import java.security.PrivateKey;

import org.springframework.http.HttpRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;

/**
* Utility class for signing Spring RestTemplate requests.
*/
public class SpringHttpRequestSigner extends AbstractSigner {

public SpringHttpRequestSigner(String consumerKey, PrivateKey signingKey) {
super(consumerKey, signingKey);
}

public void sign(HttpRequest request, byte[] bytes) {
HttpHeaders headers = request.getHeaders();
Charset charset = getCharset(headers);
String payload = (null==bytes ? null : new String(bytes, charset));
String authHeader = OAuth.getAuthorizationHeader(request.getURI(), request.getMethod().toString(), payload, charset, consumerKey, signingKey);
headers.add(OAuth.AUTHORIZATION_HEADER_NAME, authHeader);
}

private static Charset getCharset(HttpHeaders headers){
Charset defaultCharset = Charset.defaultCharset();
MediaType contentType = headers.getContentType();
if(contentType != null){
Charset charset = contentType.getCharset();
if(charset != null){
return charset;
}
}
return defaultCharset;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
package com.mastercard.developer.signers;

import com.mastercard.developer.test.TestUtils;

import org.springframework.http.HttpRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;

import java.net.URI;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.security.PrivateKey;

public class SpringHttpRequestSignerTest {

private static final HttpMethod POST_METHOD = HttpMethod.POST;
private static final HttpMethod GET_METHOD = HttpMethod.GET;
private static final String DEFAULT_BODY = "{\"foo\":\"bar\"}";
private static final String DEFAULT_CONSUMER_KEY = "Some key";

private PrivateKey signingKey;
private URI uri;
private HttpHeaders headers;
private HttpRequest request;

@Before
public void initialize() throws Exception {

signingKey = TestUtils.getTestSigningKey();
uri = new URI("https://api.mastercard.com/service");
headers = new HttpHeaders();
request = new HttpRequest() {
@Override
public HttpMethod getMethod(){
return POST_METHOD;
}
@Override
public String getMethodValue(){
return getMethod().toString();
}
@Override
public URI getURI(){
return uri;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
};
}

@Test
public void testSignShouldAddOAuth1HeaderToPostRequest() {

// WHEN
SpringHttpRequestSigner instanceUnderTest = new SpringHttpRequestSigner(DEFAULT_CONSUMER_KEY, signingKey);
instanceUnderTest.sign(request, DEFAULT_BODY.getBytes());

// THEN
String authorizationHeaderValue = headers.getFirst(HttpHeaders.AUTHORIZATION);
Assert.assertNotNull(authorizationHeaderValue);
}

@Test
public void testSignShouldAddOAuth1HeaderToPostRequestWithCharset() {

// GIVEN
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

// WHEN
SpringHttpRequestSigner instanceUnderTest = new SpringHttpRequestSigner(DEFAULT_CONSUMER_KEY, signingKey);
instanceUnderTest.sign(request, DEFAULT_BODY.getBytes());

// THEN
String authorizationHeaderValue = headers.getFirst(HttpHeaders.AUTHORIZATION);
Assert.assertNotNull(authorizationHeaderValue);
}

@Test
public void testSignShouldAddOAuth1HeaderToPostRequestWithInvalidCharset() {

// GIVEN
headers.setContentType(MediaType.APPLICATION_PDF);

// WHEN
SpringHttpRequestSigner instanceUnderTest = new SpringHttpRequestSigner(DEFAULT_CONSUMER_KEY, signingKey);
instanceUnderTest.sign(request, DEFAULT_BODY.getBytes());

// THEN
String authorizationHeaderValue = headers.getFirst(HttpHeaders.AUTHORIZATION);
Assert.assertNotNull(authorizationHeaderValue);
}

@Test
public void testSignShouldAddOAuth1HeaderToGetRequestNullBody() {

// GIVEN
request = new HttpRequest() {
@Override
public HttpMethod getMethod(){
return GET_METHOD;
}
@Override
public String getMethodValue(){
return getMethod().toString();
}
@Override
public URI getURI(){
return uri;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
};

// WHEN
SpringHttpRequestSigner instanceUnderTest = new SpringHttpRequestSigner(DEFAULT_CONSUMER_KEY, signingKey);
instanceUnderTest.sign(request, null);

// THEN
String authorizationHeaderValue = headers.getFirst(HttpHeaders.AUTHORIZATION);
Assert.assertNotNull(authorizationHeaderValue);
}

@Test
public void testSignShouldAddOAuth1HeaderToGetRequestEmptyBody() {

// GIVEN
request = new HttpRequest() {
@Override
public HttpMethod getMethod(){
return GET_METHOD;
}
@Override
public String getMethodValue(){
return getMethod().toString();
}
@Override
public URI getURI(){
return uri;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
};

// WHEN
SpringHttpRequestSigner instanceUnderTest = new SpringHttpRequestSigner(DEFAULT_CONSUMER_KEY, signingKey);
instanceUnderTest.sign(request, "".getBytes());

// THEN
String authorizationHeaderValue = headers.getFirst(HttpHeaders.AUTHORIZATION);
Assert.assertNotNull(authorizationHeaderValue);
}

}

0 comments on commit 2472de1

Please sign in to comment.