0

我的问题是如何以编程方式创建身份验证/登录窗口的后续行动。对该问题的一个答复建议我查看https://meta.stackexchange.com/a/293498/148310中的示例代码。

我实现了该代码,现在我能够获得登录/身份验证窗口。现在的问题是,在输入我的登录凭据后,我立即被重定向到我指定的 redirect_uri URL 地址(本地主机,见图),浏览器在此处抱怨“加载页面问题”、“无法连接”错误/警告(点击查看image)我认为这种情况正在终止我的代码的执行。请注意,尽管浏览器的页面加载问题,所需的访问令牌编号似乎确实附加到了 URL 的末尾,这是应该的。问题是我的代码在读取重定向页面的令牌之前被浏览器加载问题终止。

我的代码中的以下片段(也包含在上面链接中给出的示例代码中)查看窗口的 URL 以确定浏览器是否已重定向(由 URL 地址中的“oauth/login_success”表示)。该代码将重定向的浏览器视为用户成功登录/身份验证的指示;URL 地址末尾的访问令牌已准备好以编程方式提取和应用。(就我而言,我希望代码在 API 调用中使用令牌从我的 Mendeley 研究小组帐户下载 bibtex 文件)。否则,将触发登录/认证过程的执行。

function getInfo()
{
if (location.pathname == "/oauth/login_success") {
processOauthPopup ();
}
else {
authorizeAndThenRunMain ();
}
} 

在我的代码中,在 authorizeAndThenRunMain 函数的末尾,我有一个对 getInfo() 的回调,期望代码随后会选择 processOathPopup 函数。相反,当浏览器重定向到 localhost 时,代码似乎停止执行。如果我再次按下我的 ShareLatex 页面上的按钮以发起另一个对 getInfo 的调用,我将再次看到登录/身份验证屏幕。代码永远不会继续提取访问令牌(在图像中显示的重定向 url 的末尾)并在 processOauthPopup () 函数下完成所需的任务。

说到重点,我的问题是: 我如何告诉我的代码忽略重定向窗口有加载错误的事实,并继续从该窗口中的 URL 中提取令牌并继续执行 processOathPopup 函数?

为了详细说明,我推测我的代码存在 2 个潜在问题,这些问题可能与代码从不选择 processOathPopup 选项的问题有关:

  1. 我的 GreaseMonkey 脚本在 www.sharelatex.com/projects/xxxxx 上运行,其中 xxxxx 特定于用户帐户和帐户中正在编辑的文档(想想 Google Drive,其中每个文档都有一个唯一的 ID 号)。我的代码将我带到一个 api.mendeley.com/oauth/ 站点,在那里我进行身份验证和登录,然后我被重定向到 localhost:5000/oauth/login_success 链接(见图)。 我的重定向 url 指向本地主机而不是 sharelatex.com 的根本问题是什么?

    • 如果是这样,“www.sharelatex.com/oauth/login_success”不指向真实网站是否重要?
    • 如果确实“sharelatex”需要成为重定向 URL 的一部分,它是否需要与我开始的 sharelatex 页面相同的 URL 地址?或者它可以是一个截断的地址,特定于文档的信息被编辑(例如,上面描述的链接到 sharelatex 中特定文档的 xxxxx 内容)。每次我想将此代码用于不同的 sharelatex 文档时,都必须通过 Mendeley 用户脚本注册系统来更改 URL,这并不好。即使这样,添加到合法 URL 的“/oauth/login_success”也会导致重定向 URL 指向不存在的网站,我认为这是使用 localhost 重定向的问题。
  2. 为了让 location.pathname 永远等于“/oauth/login_success”,重定向窗口是否不需要从我最初启动代码执行的地方加载/替换我的 sharelatex 窗口(我的 GreaseMonkey 代码在我的 ShareLatex 网站上创建了一个按钮我用来启动上述getInfo函数的执行)。

    • 或者 location.pathname 是否足够聪明,可以指向浏览器中最近打开的任何选项卡(例如,api.mendeley.com 后跟重定向的 localhost URL),而不是始终指向 javascript 所在的 sharelatex.com 窗口/userscript 启动了吗?
    • 如果确实 location.pathname 指向最近的选项卡而不是原始的 sharelatex.com 窗口,那么我如何让代码指向原始的 ShareLatex 窗口,以便它可以在那里侦听未来的按钮推送事件?

我很困惑......任何帮助将不胜感激!

4

0 回答 0