【问题标题】:Authorization via browser通过浏览器授权
【发布时间】:2012-12-01 19:58:52
【问题描述】:

我正在尝试编写一个与 Last.fm API 交互的应用程序,但我遇到了问题。 我的问题与授权有关。引自 Last.fm API 网站:

您的应用程序需要打开 Web 浏览器的实例并发送 用户使用您的 API 密钥和身份验证访问 last.fm/api/auth 令牌作为参数。使用 HTTP GET 请求。

我知道如何发送 GET 请求以及如何使用指定的 URL 打开浏览器。但是,当用户在浏览器中批准或不批准授权时,如何实现此功能并捕获我的应用事件?也许我应该使用 HTTP GET 15 秒,如果我没有收到用户名,我应该要求用户再次执行授权。这是正确的方法吗?

【问题讨论】:

  • 是涉及浏览器,还是纯粹使用C++代码发送HTTP请求?

标签: c++ http http-get last.fm


【解决方案1】:

这有点意思。说明看起来很简单,但这实际上是一个难题,甚至Last.fm自己的liblastfm C++ library与服务交互似乎都没有提供解决方案。

按照难度递增顺序排列的一些方法包括:

  • 打开默认网络浏览器访问该 URL,并显示一个按钮供用户在授权应用程序后单击。

    优点:简单

    缺点:用户体验差。您需要确保有明确的说明供用户遵循,以免他或她感到困惑。此外,用户可能会认为您的应用已损坏,因为“他们已经授权了您的应用!”,直到他或她按下按钮时才意识到您的应用并不知道这一点。

  • 打开默认 Web 浏览器访问该 URL,显示无限期的“等待来自 Last.fm 的授权”消息,并每隔 15 秒左右轮询一次auth.getSession 方法 API 调用,以查看用户是否已授权您的应用程序。也许还提供一个“立即检查”按钮。

    优点:简单且没有那么糟糕的用户体验。

    缺点:API 似乎没有提供表明用户拒绝授权的错误代码。您可能不知道用户是否曾经授权过您的应用程序,并且您可能会永远等待授权。另外,我不知道 auth.getSession 调用是否有限制,但您可能会遇到速率限制问题。

  • 在您的应用程序中嵌入网络浏览器。您可以完全控制它,并且设置事件处理程序应该很简单。

    优点:无需轮询,因为应用程序会在用户提交表单时收到通知。

    缺点:用户界面可能会让某些用户感到困惑。

  • 向操作系统注册自定义 URI 方案并使用 Last.fm 的instructions for authorizing web applications

    这个想法是注册一个 URI 方案(也称为应用程序协议;例如 myApp://)并使用自定义方案指定一个回调 URL(例如 myApp://lastFmAuthorizationCallback)。

    见:

  • (特定于平台)自动化网络浏览器。执行此操作的具体方法取决于网络浏览器和平台。

    优点:可以无缝。如果做得好,应该提供出色的用户体验。

    缺点:开发起来很棘手,而且随着浏览器的升级,自动化可能会中断。

【讨论】:

    【解决方案2】:

    这部分取决于您用于启动浏览器进程的 API。如果您使用的 API 可以检测到启动的进程何时退出,请使用该机制。对 HTTP GET 的 /auth 调用您不会收到任何类型的用户名。根据authentication documentation for desktop apps的其余部分,当用户批准后浏览器会自动关闭:

    一旦用户授予您的应用程序使用他们的权限 帐户,基于浏览器的过程结束,并要求用户 关闭他们的浏览器并返回您的应用程序

    在此之后,您还需要执行一些步骤。接下来您需要致电auth.getSession 来获得会话。如果用户尚未批准您的应用,则此调用将失败(您可以向用户显示他们需要批准您的应用并再次向他们提供链接的失败)。以下是列出的可能错误类型:

    错误

    4 : 提供的身份验证令牌无效

    14 : 这个令牌没有被授权

    15 : 此令牌已过期

    4 : 身份验证失败 - 您没有访问服务的权限

    9 : 无效的会话密钥 - 请重新验证 10 : 无效的 API 密钥 - 您必须被授予一个

    等等

    在您批准会话后,您就可以开始进行适当的调用

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2016-06-23
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多