如何从 Spotify 访问令牌中检索数据以及如何验证访问令牌

时间:2021-03-01 21:30:49

标签: authentication oauth-2.0 oauth jwt spotify

Spotify Api 有一个 authorize users 选项,我目前正在使用它。授权完成后,您将收到一个身份验证令牌,可将其兑换为访问令牌和刷新令牌。在我的用例中,访问令牌将发送到使用 /me 调用请求用户详细信息的后端,之后将根据 Spotify 数据创建或登录用户。 Spotify ID(在响应中)将用于在我的后端创建用户,因此基本上您的 Spotify ID 与后端的帐户相关联。

我目前面临的问题如下:为了获取用户的 Spotify ID,后端必须进行 /me 调用。这并不理想,因为 Spotify 有速率限制,可以通过这种方式轻松触发。通常,当您使用 OAuth 进行身份验证时,您会收到一个 JWT 令牌,其中包含数据,可能是一个 id。您还可以使用您的公钥/私钥验证 JWT 令牌是否已被篡改。在 Spotify 的情况下,我们收到的不是 JWT 令牌,而是通用令牌。我似乎无法找到如何从令牌中获取任何信息,我只是不知道。我尝试过 Base64 解码它,然后 AES(以及 DES 和 TripleDES 以及 Rabbit 和 RC4)使用公钥/私钥对其进行解密,但没有检索到有用的数据。我找不到任何关于如何从中获取任何数据的信息,似乎还没有人尝试过..

Auth0 有一个 Spotify integration,他们也(从我所见)在后端使用 /me 调用。我想他们正在使用代理或类似的工具来绕过速率限制,但这暂时不适用。我预见的问题是来自互联网的任何 Spotify 令牌都可能登录到我的后端,因为我无法验证是否已使用我的客户端 ID 创建了令牌...

希望 StackOverflow 上的一些陌生人知道答案,或者知道如何提供帮助,我列出了我检索到的所有公钥/私钥和响应(注意:这些是测试密钥,不是我的应用程序的密钥 ?) :

Client ID: 6577d59d8dd643d5b2e53b25b0d5211e
Client Secret: c04640db6312400c9611229a81e65c6b
Authorization code: AQAGm98h91D9AsvavJXAL_V5DK-r6BtybDPbg7B31vZocO7TjOXqLQwhVSOmrHViXkippOPFjtrNjEjCQG6D0n1ImYbFXaTUNYGK4uIaeqqUdGne-KTZBE3MmBUP0iagpCY5HVjtTnty2FnL_JjD1a6omPAvSqTds1iexV6a
Access Token: BQAdbMy4Dhj0VCfnFS_VcEgjmMHBb9Sekjcal5F8T9HaXb7zIJjtsIRgjuzp4x3SGvAXgBw1NWdURSGGGHP5wPSU0Baqc9Zz4b5AvPGOX6aZy6w5c15GktTT_bvB-3wA3rfOqjYsrAGuzHuqxz0simNcYiQNiIyuhw
Refresh Token: AQApR35msEEcgq0pH7TWPXefcA8bHvc2rApA-mxRAuPo3QJVu5ksZMJMmh4jXy6USj2napzrZ9bJijVbkpZpgzPE8js-i-e9f7vVO0INnp-Q3P_gt3MIQ-4AbQ8eDBXORmw

TL;DR:

如何从 Spotify 访问令牌中获取数据,可能使用客户端 ID/客户端密钥?

因为我想不出(这就是问题)验证令牌的任何方式,所以任何 Spotify 令牌都可用于在我的后端创建帐户,而不仅仅是使用我的客户端 ID 创建的令牌。

1 个答案:

答案 0 :(得分:0)

如果您尝试在自己的 API 中使用外部访问令牌,这是一个常见问题。此类访问令牌仅适用于 Spotify API,不适用于您自己的 API。

访问令牌格式可能是参考令牌,它使用的声明只能通过 OAuth 内省检索,我怀疑您是否有权执行该操作。

正确的方法

  • 您提供授权服务器 (AS),例如 Auth0
  • 用户可以通过多种方式登录,其中一种是Spotify
  • 要让用户登录,您的应用首先重定向到您的 AS,然后重定向到 Spotify,在那里用户进行身份验证
  • Spotify 向您的 AS 发出令牌,然后 AS 向您的 UI 发出自己的令牌
  • 您的 UI 将令牌发送到您的 API,API 完全控制处理令牌及其中的任何标识符/声明/范围

这听起来可能很复杂,但所有安全细节都从您的 UI 和 API 中具体化了,因此代码很简单。我的 blog post 有关于该模式的更多详细信息。