Спасибо, что заглянули в мой вопрос.
Мое приложение Android хочет связаться с конечной точкой API, которая требует, чтобы все запросы API были подписаны с использованием ключа API и закрытого ключа в формате PEM. Когда я открываю файл .pem с помощью блокнота, содержимое оказывается обернутым в теги "---- BEGIN RSA PRIVATE KEY ---" и "------ END RSA PRIVATE KEY ---".
Я использую клиент библиотеки Retrofit для сетевых вызовов. Я настроил перехватчик OkHttpClient для перехвата и добавил заголовок «Авторизация» к исходящему запросу.
Код OkHttpClient выглядит следующим образом:
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient().newBuilder();
okHttpClientBuilder.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Log.d(TAG, "Request body: " + originalRequest.body());
Request.Builder builder = originalRequest.newBuilder().header("Authorization",
signAndGetHeaderString(context));
Request newRequest = builder.build();
return chain.proceed(newRequest);
}
});
signAndGetHeaderString () выглядит следующим образом:
private String signAndGetHeaderString(Context context) {
try {
Signature s = Signature.getInstance("SHA256withRSA");
s.initSign(getPrivateKey(context));
s.update(new Date().toString().getBytes());
byte[] signature = s.sign();
String headerStr = "Signature keyId=\"" + API_KEY + "\",algorithm=\"rsa-sha256\",signature=\"" + new String(ByteString.encodeUtf8(new String(signature)).base64()) + "\"";
return headerStr;
}catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
Код компилируется и выполняется, но все равно не работает с 401 несанкционированной ошибкой.
Я проверил и подтвердил, что учетные данные работают нормально.
Есть идеи, почему это не удается? Спасибо за помощь.