CSRF token validation failed in Odata4j

1.2k views Asked by At

I'm trying to post the entry to Odata service Url which is created in SAP ABAP backend. When i'm trying to send the data from java code to SAP ABAP system via Odata service, I'm getting CSRF Token validation error. Below is the code snippet for Odata Post service

    ODataConsumer.Builder builder = ODataConsumers.newBuilder(URL_ODATASERVICE);
    // LOGGER.info(TAG+"Authentication values are been set");

    builder.setClientBehaviors(new BasicAuthenticationBehavior(USERNAME, PASSWORD), new SAPCSRFBehavior());

    ODataConsumer consumer = builder.build();

    OCreateRequest<OEntity> createRequest = consumer.createEntity("LogSet")
            .properties(OProperties.string("TestplanId", "111")).properties(OProperties.string("ProcessId", "222"))
            .properties(OProperties.string("Seqno", "33"));

    // Execute the OData post
    OEntity newMaterial = createRequest.execute();

And the SAPSCRBehaviour class will be

public class SAPCSRFBehaviour implements JerseyClientBehavior {
private static final String CSRF_HEADER = "X-CSRF-Token";
private static final String SAP_COOKIES = "SAP_SESSIONID";
private String xsrfCookieName;
private String xsrfCookieValue;
private String xsrfTokenValue;

@Override
public ODataClientRequest transform(ODataClientRequest request) {
    if (request.getMethod().equals("GET")) {
        request = request.header(CSRF_HEADER, "Fetch");
        return request;
    } else {
        return request.header(CSRF_HEADER, xsrfTokenValue).header("Cookie", xsrfCookieName + "=" + xsrfCookieValue);
    }
}

@Override
public void modifyWebResourceFilters(final Filterable arg0) {
}

@Override
public void modifyClientFilters(final Filterable client) {
    client.addFilter(new ClientFilter() {
        @Override
        public ClientResponse handle(final ClientRequest clientRequest) throws ClientHandlerException {
            ClientResponse response = getNext().handle(clientRequest);
            List<NewCookie> cookies = response.getCookies();
            for (NewCookie cookie : cookies) {
                if (cookie.getName().startsWith(SAP_COOKIES)) {
                    xsrfCookieName = cookie.getName();
                    xsrfCookieValue = cookie.getValue();
                    break;
                }
            }
            MultivaluedMap<String, String> responseHeaders = response.getHeaders();
            xsrfTokenValue = responseHeaders.getFirst(CSRF_HEADER);
            return response;
        }
    });
}

@Override
public void modify(final ClientConfig arg0) {
}}

Please suggest me the solution to avoid this issue

Best Regards, Naveen

0

There are 0 answers