Ballerina Oauth2认证端点返回406。

我试图调用一个使用Oauth2密码凭证的第三方服务来获取认证令牌。Ballerina返回以下信息。

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代码让我很困惑,因为我已经将内容类型和接受头都设置为 “applicationjson”,这是服务所要求的。然而,第二条消息说 “Failed to generate OAuth2 token”,所以会不会是调用Oauth token时返回406?如果是这样,我如何设置token服务调用的accept头?

使用Ballerina,我调用了令牌端点并成功获取了令牌,但如果我尝试使用PasswordGrantConfig调用服务,就会出现这些错误。我已经尝试了所有我能想到的方法,并成功地让其他使用ClientCredentialsGrantConfig的服务工作。

相关代码如下。下面三个部分是3个不同.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"" (empty)也失败了,所以我怀疑BearerAuthHandler并没有设置任何值给 accept.

所以我可以强制BearerAuthHandler设置一个 accept"application/json"

谢谢!见下图。Picture showing requirement for content-type to be set to “application/JSON”

另外,你引用的Oath2规范中的例子显示了一个内容类型的值被设置。即使是一个值为 “*/*” 但我怀疑Ballerina将其留为空白。需要能够为OutboundOAuth2Provider设置http头值。

解决方案:

的主要目标是 http:OutboundAuthHandler 对象是为了准备 http:Request 含有需要与您调用的外部端点进行认证的认证信息。

呼叫的 http:BearerAuthHandler 负责添加 Authorization 的值的头。Bearer <token>. “令牌 “是用提供的信息准备的。因此,没有选择强制 http:BearerAuthHandler 来设置任何请求的头。

但在这种情况下,如果API成功响应,如果存在 Accept 的值的头。application/json,您可以简单地将该头添加到 http:Request 然后再调用POST请求,如下所示。

request.addHeader("Accept", "application/json");

给TA打赏
共{{data.count}}人
人已打赏
未分类

工厂法C++

2022-9-9 2:45:18

未分类

C程序。取字符串输入到char指针问题

2022-9-9 2:45:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索