Как заставить песочницу Optum аутентифицироваться с помощью OAuth 2.0 с помощью Java и okhttpJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как заставить песочницу Optum аутентифицироваться с помощью OAuth 2.0 с помощью Java и okhttp

Сообщение Anonymous »

Я пытаюсь получить приложение Java, которое использует okhttp для правильной аутентификации с помощью API Optum, как описано здесь. Хотя я могу получить правильный ответ от инструмента тестирования, я не могу получить правильный ответ от приложения Java.
Используя информацию в разделе Разрешения и области API
em> в документации API мне удалось заставить вызов работать в Postman (приложение, используемое для проверки http-запросов). Когда я копирую вызов на Java, я получаю ошибку сервера 500, хотя ожидаю перенаправления 302. Служба поддержки API в Optum не смогла объяснить, почему тот же вызов Postman не работает в Java, поэтому я решил спросить здесь, на случай, если кто-нибудь найдет, как обойти эту проблему, или у меня есть что-то, что я мог бы попробовать.< /p>
Я пришел к выводу, что вызов Postman и вызов Java эквивалентны, так это отправить запрос на https://httpbin.org, который возвращает то, что он видит.
Я пришел к выводу, что вызов Postman и вызов Java эквивалентны.
Я пришел к выводу, что вызов Postman и вызов Java эквивалентны, так это отправить запрос на https://httpbin.org, который возвращает то, что видит.
p>
Мой экспорт Postman, включающий TestAuthHttpBin и TestAuthOptumSandbox, можно найти в моем проекте GitHub. Это можно импортировать в Postman, если вы хотите проверить это самостоятельно. Импортируйте коллекцию, перейдите на вкладку «Авторизация», а затем «Получить новый токен доступа» при каждом запросе. Вот экран Почтальона:
Изображение

Вот код, который я запускаю (доступен здесь), который разработан так, чтобы быть эквивалентным Звонок почтальона:

Код: Выделить всё

public class FirstGetOptum {

//============================= URL PARAMETERS ================================================================

public static final ArrayList
> URL_PARAM_LIST = new ArrayList();
{
URL_PARAM_LIST.add(new Pair("response_type", "code"));
URL_PARAM_LIST.add(new Pair("client_id", "55796a71-8104-4625-b259-bb91e9f13a60"));
URL_PARAM_LIST.add(new Pair("state", "0124"));
URL_PARAM_LIST.add(new Pair("scope", "patient/Patient.read"));
URL_PARAM_LIST.add(new Pair("redirect_uri", "https://sites.google.com/sengsational.com/privacy/privacypolicy"));
URL_PARAM_LIST.add(new Pair("code_challenge", "s6kElxScJMXGilr1VTwZYsjlq5XexWCUn94rmO7Y29o")); // optionally replaced in main()
URL_PARAM_LIST.add(new Pair("code_challenge_method", "S256"));
}

//============================= HEADERS ================================================================

public static final ArrayList HEADER_LIST = new ArrayList();
{
HEADER_LIST.add(new Pair("Upgrade-Insecure-Requests", "1"));
HEADER_LIST.add(new Pair("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) PostmanCanary/11.2.14-canary240621-0734 Electron/20.3.11 Safari/537.36"));
HEADER_LIST.add(new Pair("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"));
HEADER_LIST.add(new Pair("Sec-Fetch-Site", "none"));
HEADER_LIST.add(new Pair("Sec-Fetch-Mode", "navigate"));
HEADER_LIST.add(new Pair("Sec-Fetch-User", "?1"));
HEADER_LIST.add(new Pair("Sec-Fetch-Dest", "document"));
HEADER_LIST.add(new Pair("Accept-Encoding", "gzip, deflate, br"));
HEADER_LIST.add(new Pair("Accept-Language", "en-US"));
}

private static String generateCodeChallenge() throws Exception {
// Construct the code challenge url parameter
StringBuilder sb = new StringBuilder ();
String characters = "01234567890abcde";
Random random = new Random ();
for (int i = 0; i < 56; i ++) {
sb.append (characters.charAt (random.nextInt (characters.length ())));
}
String randomText = sb.toString();

// Temporarily override the random text with the same text each time
randomText = "6b890b254542c9de4603278153e1b127d21730d46ac2620e6e35514c";

byte[] binaryData = null;
try {
binaryData = MessageDigest.getInstance("SHA-256").digest(randomText.getBytes(StandardCharsets.UTF_8));
} catch (NoSuchAlgorithmException e) {
throw new Exception("Failed SHA-256");
}

Base64.Encoder encoder = Base64.getUrlEncoder();
String codeChallenge = encoder.encodeToString(binaryData);
codeChallenge =  codeChallenge.replaceAll("=", ""); // remove pad
return codeChallenge;
}

public static void main(String[] args) throws Exception {
FirstGetOptum fgo = new FirstGetOptum(); // for static initializers

// Use this boolean to run the test or the actual call
HttpUrl.Builder urlBuilder = null;
boolean getHttpBinDump = false;
if (getHttpBinDump) {
urlBuilder = HttpUrl.parse("https://www.httpbin.org/get").newBuilder();
} else {
urlBuilder = HttpUrl.parse("https://sandbox.authz.flex.optum.com/oauth/authorize").newBuilder();
}

for (Pair pair : URL_PARAM_LIST) {
urlBuilder.addQueryParameter(pair.getFirst(), pair.getSecond());
}

boolean replaceCodeChallengeValue = true;
if (replaceCodeChallengeValue) {
String codeChallenge = generateCodeChallenge();
System.out.println("generated codeChallenge ["  + codeChallenge + "]");
urlBuilder.setQueryParameter("code_challenge", codeChallenge);
urlBuilder.setQueryParameter("code_challenge_method", "S256");
}

// It's not supposed to make a difference, but this bit rearranges to match the order that Postman has it
String url = urlBuilder.build().toString();
url = url.replaceAll("&code_challenge_method=S256", "") + "&code_challenge_method=S256";

System.out.println("Constructed the URL: [" + url + "]");

Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(url);

for (Pair pair : HEADER_LIST) {
requestBuilder.addHeader(pair.getFirst(), pair.getSecond());
}

List headerDebug = requestBuilder.getHeaders$okhttp().getNamesAndValues$okhttp();
for (int i = 0; i < headerDebug.size(); i = i+2) {
System.out.println("Header item: " + headerDebug.get(i) + ":" + headerDebug.get(i + 1));
}

Request request = requestBuilder.build();

OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
// There seems to be no difference if requestBuilder.addHeader() is used or if the HeaderInterceptor is used.  I left this here in case it's needed later.
okHttpBuilder.addInterceptor(fgo.new HeaderInterceptor("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) PostmanCanary/11.2.14-canary240621-0734 Electron/20.3.11 Safari/537.36"));
OkHttpClient client = okHttpBuilder.build();

Call call = client.newCall(request);

Response response = call.execute();

System.out.println("response " + response.code() + " (should be 302)");

System.out.println("response body\n" + response.body().string());

}

class HeaderInterceptor implements Interceptor {
private String mVariableValue;
private String mVariableName;

public HeaderInterceptor(String variableName, String variableValue) {
mVariableName = variableName;
mVariableValue = variableValue;
}

@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.header(mVariableName, mVariableValue)
.build();
return chain.proceed(request);
}
}
}
Для этого кода требуется библиотека ohhtp.
Когда я отправляю запрос на URL https://www.httpbin.org/ get Я получаю один и тот же вывод в Postman и в Java, но когда я отправляю запрос на URL https://sandbox.authz.flex.optum.com/oauth/authorize, я получаю тот же успех вывод с httpbin.org, но Optum выдает ошибку сервера 500 "E0020000".
Изображение

Сравнивая выходные данные httpbin, мы видим, что они идентичны, независимо от того, является ли отправителем Postman или Java (Postman вывод, вывод Java). Единственное отличие — это идентификатор трассировки, который каждый раз меняется:
[img]https:// i.sstatic.net/C6OK5Qrk.png[/img]

ПримечаниеЕсли я изменю содержимое параметров URL-адреса, чтобы они не соответствовали ожиданиям Optum API , я получаю конкретную ошибку, сообщающую мне, какой параметр является проблемой. Таким образом, сайт Optum сможет правильно проанализировать мой запрос. Просто как только запрос проходит проверку на достоверность, он кажется бомбой. Однако тот факт, что вызов Postman работает, позволяет службе поддержки API не обращать внимания на мою проблему.
Итак, чем еще могут отличаться два метода вызова по URL-адресу песочницы Optum: https ://sandbox.authz.flex.optum.com/oauth/authorize? Почему один вызов Postman работает, а другой вызов Java не работает? Что еще я могу попробовать?

Подробнее здесь: https://stackoverflow.com/questions/789 ... and-okhttp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как правильно переопределить модифицированный URL-адрес baseUrl или okhttp.Request внутри okhttp.Interceptor?
    Anonymous » » в форуме Android
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Аутентифицироваться с помощью ntlm (или Kerberos), используя Java UrlConnection
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Аутентифицироваться на сервере ресурсов на другом сервере ресурсов
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Токен JWT веб-API Asp.net Core 8 не будет аутентифицироваться
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Токен JWT веб-API Asp.net Core 8 не будет аутентифицироваться
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»