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

Open Authorization code flow popup, get token and use it on same button click

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

小部件是用户可以从服务门户请求的目录项的一部分。所以流程就像:

  1. 用户登录服务门户并选择项目。

  2. 用户在项目的引用字段中选择了一条记录。此项目还有一个按钮,当用户单击该按钮时,他会看到一个授权弹出窗口,其中会出现第三方登录 UI。他输入第三方系统的凭据。如果身份验证成功,弹出窗口将关闭并且令牌将保存在 'oauth_credential' ServiceNow table.

幕后发生的事情是我正在使用 ServiceNow 'REST message' 模块中的 ServiceNow 'Get OAuth Token' 功能。见下文:

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 中。

问题:

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

弹出窗口关闭后我可以停止页面刷新吗?我可以在 popup window 行之后添加一些逻辑吗,这个逻辑应该只在 popup 关闭后执行。

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

既然你说当弹出窗口关闭时页面正在重新加载,那么肯定有一些代码正在重新加载页面,因为它不会自动发生。该代码可能位于 'message' 事件处理程序中,该处理程序使用弹出窗口中的 'postMessage' (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) 触发。您可以从那里删除重新加载逻辑。

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

感谢您的建议。我让它在页面加载时工作。在页面加载时,我检查 ServiceNow table 中的令牌,如果令牌可用且有效,我将跳过弹出窗口创建逻辑。