How to invoke a REST service protected by BasicAuth using Spring Open Feign?

Invoking REST services from Spring is much easier if you use Spring Open Feign.

It allows you to invoke REST services declaratively and saves a lot of code.

Here is the post explaining the basic concept of Open Feign:

How to call a REST service declaratively using Open Feign?

It is a very simple example with no authentication involved.

I went on to protect the REST service I invoked using Open Feign, with Basic Authentication.

And then when I tried to hit a REST service which internally used Open Feign to invoke the now protected REST service, I got the below error:

That is because I didn’t customize Open Feign to deal with authentication.

Below is the FeignClient code as explained in the above link:

package com.springboot.openfeign;

import java.util.List;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "personclient", url = "http://localhost:8090/")
public interface PersonClient {

	@RequestMapping(method = RequestMethod.GET, value = "/persons")
	List<Person> getPersons();
}

To enable authentication , add authorization header as a parameter to the above getPersons() method. Here is the updated code:

package com.springboot.openfeign;

import java.util.List;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "personclient", url = "http://localhost:8090/")
public interface PersonClient {

	@RequestMapping(method = RequestMethod.GET, value = "/persons")
	List<Person> getPersons(@RequestHeader("Authorization") String header);
}

I have added a @RequestHeader annotation with ‘Authorization’ as a parameter to it.

To pass this authorization header while invoking the above rest service , build the basic authentication header as below:

package com.springboot.openfeign;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RestConsumer {

	@Autowired
	private PersonClient client;

	@GetMapping("/getAllPersons")
	public List<Person> getAllPersons() {

		String username = "admin";
		String password = "admin";

		byte[] encodedBytes = Base64Utils.encode((username + ":" + password).getBytes());

		String authHeader = "Basic " + new String(encodedBytes);

		return client.getPersons(authHeader);
	}
}

After making the above changes , I hit the service again:

I got the response!

Here is the github url for the entire code of feign client:

https://github.com/vijaysrj/openfeign


Posted

in

by

Comments

One response to “How to invoke a REST service protected by BasicAuth using Spring Open Feign?”

  1. […] How to invoke a basic authenticated REST service using Open Feign? […]

Leave a Reply to How to send multiple headers using Open Feign ? – The Full Stack DeveloperCancel reply

Discover more from The Full Stack Developer

Subscribe now to keep reading and get access to the full archive.

Continue reading