6

我想在 serviceNow(如 Facebook)中创建一个应用程序,通过 OAuth 将能够为不同的实例调用 REST API。

假设我在 servicenow 的实例 A 中创建了一个应用程序,现在通过适当的 OAuth 和权限机制,我想访问其他实例的 REST API。

到目前为止,我能够创建一个应用程序并将其注册到应用程序注册表中,并且我还能够验证该实例的 Oauth(生成令牌);但现在我想为其他实例做这件事,而不是每次都创建一个新的应用程序。当我尝试这样做时,我收到此错误:

未授权客户端:提供的客户端凭据(
您正在使用的服务的凭据)无效或不受信任

4

1 回答 1

2

在实例 A 上的应用程序中,您需要为要连接的每个实例保存 OAUTH 凭证。
https://docs.servicenow.com/bundle/paris-servicenow-platform/page/product/meeting-extensibility/task/create-app-registry-meeting-extensibility.html

在您的应用程序中,根据您要连接的实例,您需要为该实例使用正确的凭据。

不能为多个实例重用相同的 OAUTH 令牌,因为可以重用相同的 username:password 组合和基本身份验证。

但是,您可以为每个连接创建一个 oauth_entity_profile。然后,在发送请求之前,您会在实例列表上请求循环,然后注入正确的身份验证。
https://developer.servicenow.com/dev.do#!/reference/api/rome/server/sn_ws-namespace/c_RESTMessageV2API#r_RMV2-setAuthenticationProfile_S_S

同时还使用以下方法为给定实例调用正确的 url:
https ://developer.servicenow.com/dev.do#!/reference/api/rome/server/sn_ws-namespace/c_RESTMessageV2API#r_RESTMessageV2_setEndpoint_String_endpoint

var instances = [{name: 'instance_x', oauth_id: '2394829384..'}, {name: 'instance_y', oauth_id: '2394829384..'};
for (var i = 0; i < instances.length; i++){
    var inst = instances[i];
    var sm = new sn_ws.RESTMessageV2("<REST_message_record>", "get");  

       //set auth profile to an OAuth 2.0 profile record.
    sm.setAuthenticationProfile('oauth2', inst.oauth_id); 
    sm.setEndpoint("http://web.service.endpoint");


       //In milliseconds. Wait at most 10 seconds for response from http request.
    sm.setHttpTimeout(10000); 
       //Might throw exception if http connection timed out or some issue 
       //with sending request itself because of encryption/decryption of password.
    var response = sm.execute();
    // handle your reponse  
}

其中instances.oauth_id 是oauth_entity_profile 表中记录的ID。这需要处于活动状态并拥有它们的代币才能使其正常工作。

于 2021-10-15T08:03:28.880 回答