Я пытаюсь вызвать стороннюю службу, которая использует учетные данные пароля Oauth2 для получения токена аутентификации. Балерина возвращает следующие сообщения.
2020-04-23 15:07:35,414 ERROR [ballerina/oauth2] - Received an invalid response with status-code: 406; and payload: {"fault":{"faultstring":"Raising fault. Fault name : RF.Raise-406-Exception","detail":{"errorcode":"steps.raisefault.RaiseFault"}}}
2020-04-23 15:07:35,418 ERROR [ballerina/oauth2] - Failed to generate OAuth2 token. : error {ballerina/oauth2}Error message=Received an invalid response with status-code: 406; and payload: {"fault":{"faultstring":"Raising fault. Fault name : RF.Raise-406-Exception","detail":{"errorcode":"steps.raisefault.RaiseFault"}}}
error {ballerina/http}AuthenticationFailed message=Failed to prepare request at bearer auth handler. cause=error {ballerina/auth}Error message=Failed to generate OAuth2 token. cause=error {ballerina/oauth2}Error message=Received an invalid response with status-code: 406; and payload: {"fault":{"faultstring":"Raising fault. Fault name : RF.Raise-406-Exception","detail":{"errorcode":"steps.raisefault.RaiseFault"}}}
Это код 406, который меня смущает, поскольку я установил как тип контента, так и заголовки accept на «application/json», что и требуется службе. Однако во втором сообщении говорится: «Не удалось сгенерировать токен OAuth2», поэтому может ли это быть вызов для получения токена oauth, который возвращает 406? Если да, то как мне установить заголовок accept для вызова службы токенов?
Используя Ballerina, я вызвал конечную точку токена и успешно получил токен, но если я попытаюсь вызвать службу с помощью PasswordGrantConfig, это будут ошибки, которые я получаю. Я перепробовал все, что мог придумать, и успешно заработал другие службы, использующие ClientCredentialsGrantConfig. Любая помощь принята с благодарностью.
Соответствующий код ниже. Три приведенных ниже раздела являются частями кода в трех разных файлах .bal.
// configure the Oauth2 Config
import ballerina/config;
import ballerina/http;
import ballerina/oauth2;
public function getOauth2Handler() returns http:BearerAuthHandler {
oauth2:PasswordGrantConfig passwordGrantConfig = {
tokenUrl: config:getAsString("experian.authentication.tokenUrl"),
username: config:getAsString("experian.authentication.username"),
password: config:getAsString("experian.authentication.password"),
clientId: config:getAsString("experian.authentication.clientId"),
clientSecret: config:getAsString("experian.authentication.clientSecret"),
credentialBearer: http:AUTH_HEADER_BEARER
};
oauth2:OutboundOAuth2Provider oauth2Provider = new (passwordGrantConfig);
return new (oauth2Provider);
}
// Configure the API Client
http:ClientConfiguration delphiSelectClientConfig = {
auth: {
authHandler: experian:getOauth2Handler()
}
};
experian:DelphiSelectClientConfig delphiSelectConfig = {
serviceUrl: config:getAsString("experian.services.delphi-select.serviceUrl"),
clientConfig: delphiSelectClientConfig
};
experian:DelphiSelectClient delphiSelectClient = new (delphiSelectConfig);
// Call the endpoint using the Oath2 configuration
import ballerina/http;
import ballerina/io;
public type DelphiSelectClientConfig record {
string serviceUrl;
http:ClientConfiguration clientConfig;
};
//==============================
//============Client============
//==============================
public type DelphiSelectClient client object {
public http:Client clientEp;
public http:ClientConfiguration config;
public function __init(DelphiSelectClientConfig config) {
http:Client httpEp = new (config.serviceUrl, {auth: config.clientConfig.auth});
self.clientEp = httpEp;
self.config = config.clientConfig;
}
public remote function newApplication() returns @untainted json|error {
io:println("In newApplication function");
http:Request request = new;
json requestBody = newApplicationBody; // get test data from json in another file
request.setJsonPayload(requestBody);
var response = check self.clientEp->post("/application", request);
var payload = check response.getJsonPayload();
return payload;
}
};
Я также модифицировал свой тестовый код, чтобы он вызывал токен EP, и намеренно установил accept
в недопустимое значение, например, "text/csv"
. В этом случае я получаю тот же ответ об ошибке. Однако установка accept
на "*/*"
работает. Финальный тест; accept
из ""
(пусто) также не работает, поэтому я подозреваю, что BearerAuthHandler не устанавливает никакого значения для accept
.
Итак, могу ли я заставить BearerAuthHandler установить accept
из "application/json"
?
Кроме того, пример в спецификации Oath2, на которую вы ссылаетесь, показывает устанавливаемое значение типа контента. Подойдет даже значение “*/*”
, но я подозреваю, что Ballerina оставляет его пустым. Я поднял вопрос GitHub Необходимо установить значения заголовка http для OutboundOAuth2Provider< /а>