以 Spotify 为例解释 OAuth 如何运作
它是什么?
工作原理
创建“客户端应用程序”
建立与“提供商”的链接
为重定向 URL 创建端点
测试它是否有效
也保存刷新令牌
为什么每个人都实施 OAuth?
不要发明自行车
你有没有想过什么是 OAuth?它是如何工作的?为什么一些比较热门或不太热门的网站会实现它?在本文中,我们将探讨这些问题,并用 Python 编写代码,以便在 Spotify 中使用 OAuth。
它是什么?
根据维基百科,OAuth 是
OAuth 是一种访问委托的开放标准,通常用于互联网用户授予网站或应用程序访问其在其他网站上的信息的权限,但不向其提供密码。
听起来很有道理。我们用 Spotify 来具体解释一下。
OAuth 通常用作互联网用户授予网站或应用程序(您的网站或应用程序)访问其在其他网站(Spotify )上的信息(例如他们最喜欢的艺术家,或将新艺术家添加到收藏夹的能力)的方式,但不向他们提供密码。
还有一件事。“OAuth 是一个开放标准”,这意味着它对于所有其他实施 OAuth 的网站(例如 Facebook、Twitter)都具有同样的功能。
工作原理
在高层次上,您(也称为客户端,您尝试与其进行 OAuth 的网站称为提供商)获取用户的访问令牌(本质上是一个密码),并且通过它,您可以使用所谓的“范围”中列出的所有访问权限。
- 用户点击提供商网站的链接,该链接将请求授权
- 用户看到授权屏幕
- 用户接受你的范围
- 用户通过访问令牌重定向到“重定向 URL”
- 现在您可以使用访问令牌请求所需的数据
但是我们需要做什么才能让它发挥作用呢?
创建“客户端应用程序”
首先,您需要创建一个“客户端应用程序”。它的主要目的是确定在步骤#4中将用户重定向到哪里。
客户端应用程序的另一个目的是在步骤#2的授权屏幕上显示项目的名称和简要说明。
您可以通过谷歌搜索找到一个可以执行此操作的地方,例如使用“#{PROVIDER_NAME} oauth app”之类的查询。
建立与“提供商”的链接
首先,你需要找到如何建立链接。谷歌可以再次提供帮助。只需谷歌搜索“#{PROVIDER_NAME} oauth URL”。你应该能找到类似提供商官方文档的内容。
一旦我们找到如何建立链接,您很可能需要在其中使用几个参数:
client_id
— 客户端应用程序的标识符,以便提供商知道将用户重定向到哪里redirect_uri
— 著名的重定向 URL(提供商可以使用客户端应用程序中指定的 URL,但通常您可以在那里输入多个 URL,此参数用于澄清)scope
— 您的项目所需的访问列表(您可以在官方文档中找到范围)。
有关上面列出的参数的确切名称,请参阅官方文档。
我将展示在我的案例中需要构建的内容。关于范围,我需要user-read-email
读取user-follow-read
用户的电子邮件以及他们关注的内容。首先,我将指向服务器运行的 URL
provider_url = "https://accounts.spotify.com/authorize"
from urllib.parse import urlencode
params = urlencode({
'client_id': 'MY_CLIENT_ID',
'scope': ['user-read-email', 'user-follow-read'],
'redirect_uri': 'http://127.0.0.1:5000/spotify/callback',
'response_type': 'code'
})
url = provider_url + '?' + params
url
# => 'https://accounts.spotify.com/authorize?client_id=MY_CLIENT_ID&scope=%5B%27user-read-email%27%2C+%27user-follow-read%27%5D&redirect_uri=http%3A%2F%2F127.0.0.1%3A5000%2Fspotify%2Fcallback&response_type=code'
为重定向 URL 创建端点
在步骤#4中,用户被重定向到重定向URL。包含用户信息的访问令牌将发送到此URL。
当我构建到提供商的链接时,我使用了'http://127.0.0.1:5000/spotify/callback'
重定向 URL。此链接需要指向您拥有的任何服务器上的端点。
以下是如何在 Flask 中设置端点的简单示例
from flask import Flask
app = Flask(__name__)
@app.route("/spotify/callback")
def spotify_callback():
return "You finally called me back!"
在刚刚创建的回调中,您可以对用户数据进行任何操作。您可以在项目中创建用户个人资料,向其发送电子邮件等等。但如果您以后想从该用户获取更多数据,最好将请求附带的令牌保存到数据库中。
测试它是否有效
现在您已经获得了访问令牌,您可以执行在范围内请求的操作。
我已经请求了user-follow-read
,所以现在我可以读取用户关注的艺术家,以便在新专辑发布时收到通知。Spotify 有一个端点可以获取用户关注的艺术家,所以我们就用它吧。
artists = []
all_artists_loaded = False
limit = 50
access_token = fetch_access_token() # your function to pull the token
# from the place where you saved it
url = f"https://api.spotify.com/v1/me/following?type=artist&limit={limit}&access_token={access_token}"
while not all_artists_loaded:
response = requests.get(url).json()['artists']
current_request_artists = response['items']
artists += current_request_artists
if response['next']:
url = response['next'] + f"&access_token={access_token}"
else:
all_artists_loaded = True
print(artists)
如果您想了解有关如何获取最新专辑的更多信息,您可以阅读我之前的文章。
也保存刷新令牌
遗憾的是,访问令牌通常会过期。不过幸运的是,我们可以使用请求令牌附带的刷新令牌来请求新的访问令牌。
一旦访问令牌过期,您需要向文档中指定的端点发送包含刷新令牌的请求。我们可以使用Python 中的请求库来实现。
refresh_token = pull_refresh_token() # your function to pull the token
# from the place where you saved it
client_id = "YOUR_CLIENT_ID" # that you received once you created
# the Client Application
client_secret = "YOUR_CLIENT_SECRET" # that you received once you created
# the Client Application too
refresh_url = "https://accounts.spotify.com/api/token" # from the docs
payload = {
'refresh_token': refresh_token,
'grant_type': 'refresh_token'
}
auth_header = base64.b64encode(six.text_type(client_id + ':' + client_secret).encode('ascii'))
headers = {'Authorization': 'Basic %s' % auth_header.decode('ascii')}
response = requests.post(refresh_url, data=payload, headers=headers)
token_info = response.json()
上述代码的来源。
必须再次在官方文档中找到 URL(以及可能的其他必需参数)。
为什么每个人都实施 OAuth?
这对最终用户来说很方便。OAuth 将创建密码或虚拟账户的负担从用户转移到了开发者身上。但现在,使用任何提供商并充分利用用户数据的功能应该不会太难。
不要发明自行车
几乎你遇到的任何问题都有现成的解决方案。在发明自行车之前,一定要先谷歌一下。如果你需要身份验证,已经有相应的库了。如果你需要访问某些 API,比如使用 Spotify 所需的 API,也有相应的库。
如果您想更深入地了解 OAuth,可以找到一份官方指南,其中以非常易于阅读的形式涵盖了所有内容。
另外,这是关于MuN系列文章的第四部分。敬请期待第五部分。您可以在我的GitHub 页面上找到这个项目的代码以及我的其他项目的代码。请在下方留下您的评论,如果您喜欢这篇文章,请关注我。
文章来源:https://dev.to/hmlon/explaining-how-oauth-works-with-spotify-as-an-example-5djl