【问题标题】:Trying to use oauth flow in Electron desktop app (with spotify API)?尝试在 Electron 桌面应用程序中使用 oauth 流(使用 spotify API)?
【发布时间】:2021-03-18 11:09:37
【问题描述】:

我在 Electron 中有一个 React 应用程序,我正在尝试使用 spotify-web-api-node 库访问 spotify API。但是,我不确定 oauth 流究竟是如何在 Electron 应用程序中工作的……首先,对于重定向 URL,我使用了 this question 并在我的文件中添加了一个 registerFileProtocol 调用。然后我添加了一个特定的ipcMain.on 处理程序来接收来自页面的spotify 登录调用,我已经确认它适用于控制台日志。但是,当我真正调用authorizeURL 时,什么都没有发生?

这是我的 main.js 的一部分:

app.whenReady().then(() => {
...
  protocol.registerFileProtocol(
    "oauthdesktop",
    (request, callback) => {
      console.log("oauthdesktop stuff: ", request, callback);
      //parse authorization code from request
    },
    (error) => {
      if (error) console.error("Failed to register protocol");
    }
  );
});

ipcMain.on("spotify-login", (e, arg) => {
  const credentials = {
    clientId: arg.spotifyClientId,
    clientSecret: arg.spotifySecret,
    redirectUri: "oauthdesktop://test",
  };

  const spotifyApi = new SpotifyWebApi(credentials);
  console.log("spapi: ", spotifyApi);

  const authorizeURL = spotifyApi.createAuthorizeURL(
    ["user-read-recently-played", "playlist-modify-private"],
    "waffles"
  );
  console.log("spurl: ", authorizeURL);

  axios.get(authorizeURL);
}

我希望出现典型的 spotify 登录页面弹出窗口,但这不会发生。我也希望(可能)registerFileProtocol 回调记录一些东西,但事实并非如此。我要在这里做什么? authorization guide 特别提到在 auth url 上执行 GET 请求,这就是我在这里所做的......

【问题讨论】:

    标签: node.js oauth-2.0 oauth electron


    【解决方案1】:

    在桌面应用程序中,建议打开系统浏览器,Spotify 登录页面将在那里呈现,作为创建承诺的一部分。 opener library 可用于调用浏览器。

    当用户完成登录后,该技术是通过私有 URI 方案/文件协议接收响应,然后解析承诺,获取授权码,然后将其交换为令牌。不过这很棘手。

    我的资源

    我有一些关于这方面的博客文章,您可以从中借鉴一些想法,以及一些可以在您的 PC 上运行的代码示例:

    其中第二个是 React 应用程序,使用私有 URI 方案,因此与您的非常相似。我使用AppAuth-JS library 而不是 Spotify。

    【讨论】:

    • 我在您的最终桌面示例中找不到类似的代码...我遇到的问题是我在 registerFileProtocol 中定义的处理程序显然没有从 spotify API 的回调中调用.我把记录器放在那里(并测试它们在应用程序的其他部分工作),但它们不记录任何东西。当 spotify 调用回调 URL 时会发生什么是我的应用程序“重新打开”,这是非常没用的。你知道如何正确处理对oauthdesktop://test 的响应并从中获取令牌吗?
    • 查看我的main source file 并查看对_onOpenUrl 和_onSecondInstance 的调用,这是接收登录响应的地方。重定向时,您需要在应用中全局存储一个 Promise,然后在通过上述方法处理登录响应后解决该 Promise。
    • 看起来我的诀窍不是使用registerFileProtocol,而是使用setAsDefaultProtocolClient。然后,我复制了请求单个实例锁定的代码,并将回调的处理程序放入如下:app.on("second-instance", handleCallback);(回调的第二个参数包括我需要的令牌)。关于访问令牌并刷新它们,您对在电子应用程序中处理它的最佳方式有什么建议吗?理想情况下,我不必每次启动电子应用程序时都手动获取新令牌。
    • 很高兴听到您已经解决了您的主要问题 - 请查看上面 Final Desktop 示例博客文章中的 keytar 组件 - 以及 wrapper class
    • 我会的,谢谢!最后一个问题......我得到的 Spotify 令牌会在一小时内到期,如果我在我的应用程序打开时间超过此时间时尝试使用它们,那就太糟糕了。有没有推荐的刷新它们的方法,或者我应该在每次调用 api 时简单地刷新令牌?
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2014-09-27
    • 2021-06-20
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多