Я пытаюсь получить токен с сервера OAM, используя поток предоставления паролей OAuth 2.0 в собственном приложении. Но я всегда получаю 401 неверный идентификатор клиента.
Я пробовал на почтальоне, и он работает, а также я пытался с Java-кодом, он также работает, но когда я пытаюсь реагировать на native и axios, я всегда получаю 401 недопустимую ошибку параметра id клиента.
Java-код, который работает
открытый класс TestService {
private static String ACCESS_TOKEN_URL =
"http://oauthservice/tokens";
//Redirect URI for Authorization flow
private static String REDIRECT_URI = "redirect_uri=http://ClientWebApp/index.html";
//Client Credentials
private static String CLIENT_ID = "xxxxxxxx";
private static String CLIENT_SECRET = "xxxxxxxxxxx";
private static String BASE_64_CREDENTIALS = "Basic " + new String(Base64.encode(CLIENT_ID + ":" + CLIENT_SECRET));
//Authorization and Token properties
private static String GRANT_TYPE = "grant_type=password";
private static String STATE = "state=getaccess";
private static String USERNAME = "username=xxxxxxx";
private static String PASSWORD = "password=xxxxxxx";
@GET
@Produces(MediaType.APPLICATION_JSON)
public String testService() {
String accessToken = null;
HttpURLConnection connection = null;
try {
System.out.println("###TestService called...: " );
//Constructs post Data
String params = GRANT_TYPE + "&" + USERNAME + "&" + PASSWORD;
byte[] postData = params.getBytes(Charset.forName("UTF-8"));
//Constructs URL and Connection objects, and sets headers
URL url = new URL(ACCESS_TOKEN_URL);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Authorization", BASE_64_CREDENTIALS);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
connection.setRequestProperty("Accept-Charset", "UTF-8");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Length", Integer.toString(params.getBytes().length));
connection.setDoOutput(true);
//Gets response and reads it
OutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.write(postData);
wr.flush();
wr.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer resp = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
resp.append(inputLine);
}
in.close();
String res = resp.toString();
System.out.println("res: "+res );
//Obtains access token from JSON object
JSONObject obj = new JSONObject(res);
accessToken = obj.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (connection != null) {
connection.disconnect();
}
}
return accessToken;
}
}
Реагирует на собственный код (я пробовал много способов, но ни один не работает)
1)
axios.post ( "http://oauthservice/tokens",
qs.stringify ({grant_type: "пароль",
Имя пользователя: «хххххх»,
пароль: "XXXXXXX",
область действия: "xxxxxxxx"}), {
'Content-type': 'application / x-www-form-urlencoded; charset = UTF-8',
«Авторизация»: «Базовый xxxxxxxxxxxxxxxxxxx»,
})
.then((response) => {
alert(response)
})
.catch((error) => {
alert(JSON.stringify(error.response))
})
2)
Вардар ({
метод: «пост»,
url: «oauthservice / tokens»,
заголовки: {
'Content-type': 'application / x-www-form-urlencoded; charset = UTF-8',
«Авторизация»: «Основные» + encoded_values,
},
данные: qs.stringify ({
grant_type: "пароль",
Имя пользователя: «хххххх»,
пароль: «ххххх»,
Объем: "XXXXXXXX"
})
}
) .then ((ответ) => {
Оповещение (ответ)
})
.catch ((ошибка) => {
Оповещение (JSON.stringify (error.response))
}); * * Тысяча двадцать-две
Я перепробовал множество сторонних пакетов, таких как https://www.npmjs.com/package/axios-oauth-client
Но они также дают ту же ошибку.