Как авторизовать конечную точку API, используя ключ API и закрытый ключ в формате PEM? - PullRequest
0 голосов
/ 27 августа 2018

Спасибо, что заглянули в мой вопрос.

Мое приложение 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 несанкционированной ошибкой.

Я проверил и подтвердил, что учетные данные работают нормально. Есть идеи, почему это не удается? Спасибо за помощь.

...