【发布时间】:2020-12-10 04:01:40
【问题描述】:
我有一个 Django 后端和 React/Redux 前端,我正在尝试集成 Spotify API。我是一个完全的 django 菜鸟,所以请怜悯。我目前通过前端的常规 ol' 锚标签将用户发送到我的后端。然后我的后端将用户重定向到 Spotify 授权页面,然后该页面将他们重定向到另一个页面,该页面将授权代码换成我现在拥有的访问令牌。然而,这段代码和网址只是将我发送到我的后端 API。如何使用此访问令牌让用户回到前端? “我的”代码:
from django.views.generic.base import RedirectView, TemplateView
from rest_framework.response import Response
from rest_framework import generics, viewsets, permissions
from django.urls import reverse
from furl import furl
import requests
def build_authorize_url(request):
params = {
"client_id": "<client-id>",
"response_type": "code",
"redirect_uri": request.build_absolute_uri(
reverse("spotify callback")
),
"scope": " ".join(
[
'user-read-currently-playing',
'user-modify-playback-state',
'user-read-playback-state',
'streaming',
'app-remote-control',
'playlist-read-collaborative',
'playlist-modify-public',
'playlist-read-private',
'playlist-modify-private',
'user-library-modify',
'user-top-read',
'user-read-playback-position',
'user-read-recently-played',
]
),
}
print(params)
url = (
furl("https://accounts.spotify.com/authorize")
.add(params)
.url
)
print(url)
return url
AUTH_HEADER = {
"Authorization": "Basic "
+ base64.b64encode(
"<my client id>:<my client secret>".encode()
).decode()
}
def handle_callback(request):
code = request.GET["code"]
response = requests.post(
"https://accounts.spotify.com/api/token",
data={
"grant_type": "authorization_code",
"code": code,
"redirect_uri": request.build_absolute_uri(
reverse("spotify callback")
),
},
headers=AUTH_HEADER,
)
return response.json()
class SpotifyLoginView(RedirectView):
query_string = True
def get_redirect_url(self, *args, **kwargs):
return build_authorize_url(self.request)
class SpotifyCallbackView(generics.GenericAPIView):
def get(self, request, *args, **kwargs):
print(handle_callback(request))
return Response(handle_callback(request))
【问题讨论】:
标签: django reactjs redux django-rest-framework spotify