【问题标题】:Getting a 403 Forbidden error on plugin request在插件请求中收到 403 Forbidden 错误
【发布时间】:2020-09-01 16:38:42
【问题描述】:

我正在尝试从我的 ICN 插件触发插件请求。请求如下。但是,我从服务器收到 403 Forbidden 错误。

禁止 您无权访问此服务器上的 /navigator/jaxrs/plugin。

https://<icnserver.com>/navigator/jaxrs/plugin?repositoryId=Demo&query=%5B%7B%22name%22%3A%22ID%22%2C%22operator%22%3A%22LIKE%22%2C%22values%22%3A%5B%22123434234%22%2C%22%22%5D%7D%5D&className=Checks&plugin=DemoPlugin&action=DemoService&desktop=Demo

插件 JS:

aspect.around(ecm.model.SearchTemplate.prototype, "_searchCompleted", function advisingFunction(original_searchCompleted){
    return function(response, callback, teamspace){
        var args = [];
        var templateName = response.templates[0].template_name;
        var res = response;
        var requestParams = {};
        requestParams.repositoryId = this.repository.id;
        requestParams.query = query;
        requestParams.className = templateName;
        
        Request.invokePluginService("DemoPlugin", "DemoService",
            {
                requestParams: requestParams,
                requestCompleteCallback: lang.hitch(this, function(resp) {  // success
                    res.rows = resp.rows;
                    res.num_results = resp.rows.length;
                    res.totalCount = resp.rows.length;
                    args.push(res);
                    args.push(callback);
                    args.push(teamspace);
                    original_searchCompleted.apply(this,args);
                })
            }
        ); 
    }
});

【问题讨论】:

    标签: filenet-p8 filenet filenet-content-engine ibm-content-navigator


    【解决方案1】:

    您需要提供一个 security_token 才能调用您的服务,因此您需要先登录。 然后,打开浏览器的调试并检查网络选项卡中的请求。 在那里,您可以看到以 /navigator/jaxrs/* URI 为目标的每个请求都将包含它,因此标头中将包含以下内容:

    security_token:163594541620199174

    所以我敢打赌,你没有在你的客户端中设置它(我推荐一个邮递员来测试你的服务,或者我会在 ICN 插件项目中添加一个测试(ICN)功能页面以便能够调用它适当地)。在您的功能页面中,您可以使用 ecm/model/Request OOTB navigator dojo/javascript 类直接调用您的服务,如您在CheckinAction.js 中所见:

            _checkInDocument: function (item, requestData) 
        {
            var self = this;
            var payLoadObject = {requestType: "Get", id: item.id};
            
            Request.postPluginService("DocuSignPlugin", "UpdateSignedDocumentService",  "application/json", {
                requestParams: {
                    repositoryId : item.repository.id,
                    serverType : item.repository.type,
                    docId : item.docid,
                    envelopeId: item.attributes.DSEnvelopeID,
                    payLoad: json.stringify(payLoadObject)
                },
                requestCompleteCallback: function(response) {
                    if (response.returncode == 0)
                    {
                        item.attributeDisplayValues.DSSignatureStatus = "Checkedin";
                        item.attributes.DSSignatureStatus = 4;
                        item.update(item);
                    }
                    else if (response.returncode == -1)
                    {
                        items = [];
                        items.push(item);
                        self._showLoginDialog(items);
                    }                   
                },
                backgroundRequest : false,
                requestFailedCallback: function(errorResponse) {
                    // ignore handline failures
                }
            });
        },
        
    

    如您所见,您不必将 security_token 添加到 requestParams,框架会为您完成。

    【讨论】:

    • 使用代码 sn-p 更新。我正在按照描述调用服务。我还可以从桌面上的其他插件调用服务,但只有这个会引发错误。可能是因为我发送的请求参数?
    • 不,绝对不是(好吧,你可以故意发回401)。您是否检查过浏览器调试窗口的标头中是否存在 security_token?我几乎 100% 确定您没有该标题。
    • 添加了带有请求标头的屏幕截图。它正在按预期设置 security_token
    • 嗯它应该以这种方式工作......可能还有其他一些(不寻常的)原因,比如你在 iframe 上的 javascript,你的导航器前面有一些代理服务器,或者你的用户无权访问此演示桌面或配置的存储库。
    • 我可以通过同一桌面上的其他插件发送请求。所以我很确定它与访问/权限无关。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 2021-10-05
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多