У меня есть приложение, которое использует Spring для Android на стороне клиента и Spring Boot на стороне сервера. Мы хотели бы добавить к некоторым запросам авторизацию клиента. Мы уже используем Firebase и OAuth2, и после прочтения этой темы я считаю, что лучше всего было бы использовать заголовок Authentification для отправки JWT на наш сервер с методом носителя для авторизации:
Authorization: Bearer <token>
Что-то подобное ...
Моя проблема заключается в следующем: Spring для Android имеет только встроенный BasicAccessAuthentification, но у меня нет схемы username:password для моих учетных данных клиента, только JWT. Я довольно наивно попытался создать класс, расширяющий HttpAuthentication:
import org.springframework.http.HttpAuthentication;
public class HttpBearerAuthentification extends HttpAuthentication {
private String token;
public HttpBearerAuthentification(String token){
this.token = token;
}
public String getHeaderValue() {
return String.format("Bearer %s", token);
}
@Override
public String toString() {
return String.format("Authorization: %s", getHeaderValue());
}
}
Этот класс основан на классе HttpBasicAuthentication в Spring для Android.
А потом выполняем запрос:
// regular request that I know works
...
HttpBearerAuthentification auth = new HttpBearerAuthentification(token);
headers.setAuthorization(auth)
...
// send request and get answer as usuall
Я знаю, что сами запросы работают (по крайней мере, запросы без авторизации), так что проблема не в этом. Будет ли это правильным способом? Я понимаю, что успех запроса также зависит от того, как сервер обрабатывает запрос. Но пока мой вопрос действительно о стороне клиента. Достаточно ли этого кода для отправки JWT на сервер?
После некоторого тестирования запросов, отправленных с помощью SpringForAndroid, кажется, что довольно легко установить значения для заголовков. Поскольку класс HttpHeaders фактически реализует интерфейс Map, все, что мне нужно было сделать, это:
protected HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + userRegistrationToken);