打开授权码流弹出窗口,获取令牌并在单击同一按钮时使用它

时间:2018-11-28 14:15:22

标签: javascript angularjs servicenow

我正在与第三方系统集成ServiceNow。使用此集成,用户可以从第三方系统获取数据并使用它来创建服务请求票证。对于此集成,我们在服务门户上创建了一个小部件。该集成使用授权代码流进行身份验证。

窗口小部件是目录项的一部分,用户可以从服务门户请求。因此流程如下:

  1. 用户登录到Service Portal并选择项目。

  2. 用户在项目的参考字段中选择一条记录。该项目还具有一个按钮,当用户单击该按钮时,将向他显示一个授权弹出窗口,其中会显示第三方登录UI。他输入第三方系统的凭据。如果身份验证成功,则会关闭弹出窗口,并将令牌保存在“ oauth_credential” ServiceNow表中。

幕后发生的事情是我正在使用ServiceNow“ REST消息”模块中的ServiceNow“获取OAuth令牌”功能。见下文:

HTML

 <button type="button" ng-click="checkAccess()" class="btn btn-default">Check Access</button>

客户端脚本

$scope.authorize = function() {
  glideUserSession.loadCurrentUser().then(function(currentUser) {
    var oauthRequestorSysId = currentUser.userID;
    var oauthRequestorContext = 'sys_user';
    var oauthProfileId = '59f05d7ddbf563003ca7da11cf961962';
    var redirect = "https://dev000.service-now.com/oauth_redirect.do";

    var oauth_initiator_url = '/oauth_initiator.do' +
    '?oauth_requestor_context=' + oauthRequestorContext +
    '&oauth_requestor=' + oauthRequestorSysId +
    '&oauth_provider_profile=' + oauthProfileId +
    '&response_type=code';

     window.open(oauth_initiator_url, "", "height=500,width=800");

     // additional code to use token once popup closes
  });
}

到目前为止,我已经能够实现这一目标。此弹出窗口将令牌保存到ServiceNow中。

问题:

一旦发生授权并关闭弹出窗口,页面就会刷新。我不希望页面刷新,因为用户在参考字段中所做的较早选择会在页面刷新时丢失。 我在同一授权功能中有更多代码,在这里我将使用由弹出的授权代码生成的令牌。但是问题是,如果我在弹出窗口之后添加代码,则弹出窗口会打开,但会暂停并执行下一行代码。似乎弹出窗口是异步的。附加代码功能使用弹出窗口生成的令牌从第三方系统获取数据。 我无法创建两个按钮,一个用于授权,另一个用于使用令牌。我必须单击一下才能做到这一点。

关闭弹出窗口后,我可以停止页面刷新吗?我可以在弹出窗口行之后添加一些逻辑,并且仅在关闭弹出窗口后才能执行此逻辑。

2 个答案:

答案 0 :(得分:0)

这只是一个猜测,因为我没有您的代码。

由于您说关闭弹出窗口时页面正在重新加载,所以必须有一些代码正在重新加载页面,因为它不会自动发生。该代码可能位于“消息”事件处理程序中,该事件处理程序是使用弹出窗口中的“ postMessage”(https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage)触发的。您可以从此处删除重载逻辑。

您可能会在弹出窗口中使用opener.reload,如果使用了opener.reload,则可以将其删除,以便在弹出窗口关闭后不会重新加载页面。

答案 1 :(得分:-1)

感谢您的建议。我在页面加载上工作了。在页面加载时,我检查ServiceNow表中的令牌,并且如果令牌可用且有效,则跳过弹出创建逻辑。