gpt4 book ai didi

python - 我如何处理 Django 中的 spotify api 身份验证重定向 uri?

转载 作者:行者123 更新时间:2023-11-28 19:12:41 24 4
gpt4 key购买 nike

我在 Django 中构建了一个应用程序,它使用 Spotipy,一个 Spotify API Python 库,并使用 spotipy.util.prompt_for_user_token() 命令生成 token 并访问我的私有(private)库因此:

import spotipy
import spotipy.util as util
import os, ast

#Spotify API keys
scope = "playlist-read-private"
uir = "http://localhost:8000"
username = "<MY_USERNAME>"

spotify_uid = os.environ["SPOTIFY_UID"]
spotify_usec = os.environ["SPOTIFY_USEC"]
print "retrieved keys from OS"

#set up access
def get_access():
try:
token = util.prompt_for_user_token(username, scope, spotify_uid, spotify_usec, uir)
print "SUCCESS"
return spotipy.Spotify(auth=token)
except:
print "FAILED TO LOAD"

我希望该应用程序具有 UI 登录名而不是硬编码登录名,但我不知道该怎么做。

目前我有一个“登录”按钮,它尝试通过 Javascript 触发登录页面重定向,方法是使用用户名参数调用上述代码,但会打开一个新页面,控制台中显示以下内容:

User authentication requires interaction with your
web browser. Once you enter your credentials and
give authorization, you will be redirected to
a url. Paste that url you were directed to to
complete the authorization.


Opening https://accounts.spotify.com/authorize?scope=playlist-read- private&redirect_uri=http%3A%2F%2Flocalhost%3A8000&response_type=code&client_id=<CLIENT_ID> in your browser


Enter the URL you were redirected to: [30/Jun/2016 15:53:54] "GET /?code=<TOKEN>HTTP/1.1" 200 2881

注意:括号中的文本已被替换,因为它们是私钥。

我希望它具有与本网站处理登录方式类似的功能: http://static.echonest.com/SortYourMusic/

最佳答案

为了实现这一点,我最终完全放弃了 spotipy 模块,只使用了 javascript。我看到您使用用户授权 api 流程,这很好,因为您的服务器可以安全地发送您的 key 。将此移动到应用程序的前端时,您不能这样做,而必须使用 Implicit Grant流程:

#In your main page's <script>:
var loginSpotify = function(){
var SPOTIPY_CLIENT_ID = "Your Client ID Here"
var SPOTIPY_REDIRECT_URI = "Your Django Callback View Here (www.example.com/callback/)"
var spotifyScope = "playlist-read-private"
var spotifyAuthEndpoint = "https://accounts.spotify.com/authorize?"+"client_id="+SPOTIPY_CLIENT_ID+"&redirect_uri="+SPOTIPY_REDIRECT_URI+"&scope="+spotifyScope+"&response_type=token&state=123";
window.open(spotifyAuthEndpoint,'callBackWindow','height=500,width=400');
//This event listener will trigger once your callback page adds the token to localStorage
window.addEventListener("storage",function(event){
if (event.key == "accessToken"){
var spAccessToken = event.newValue;
//do things with spotify API using your access token here!!
}
});
}

调用上述方法将打开一个新的弹出窗口,让用户通过 spotify 的登录。授权后,窗口将重定向到您指定的 Django View 。让该 View 加载一个回调页面,其唯一目的是从其 URI 收集访问 token :

#in your views.py:
def callback(request):
return render(request, 'YourApp/spotifyLoginFinish.html',{})

When that page loads, in the popup window, it's URI will contain the grant you seek, ex: http://www.example.com/callback/#access_token=BQDoPzyrkeWu7xJegj3v1JDgQXWzxQk2lgXrQYonXkXIrhmjeJVS38PFthMtffwlkeWJlwejkwewlHaIaOmth_2UJ2xJrz2x-Voq0k0T0T4SuCUdIGY3w3cj5CpULkFla9zwKKjvdauM2KoUIQa1vULz-w8Da83x1&token_type=Bearer&expires_in= 3600&state=123

不知道你是否使用 jquery,但是有很多方法可以在页面加载时调用 JS 函数。所以现在您需要做的就是在回调页面加载后解析 URI,您可以获得访问 token 。然后你就完成了这个弹出回调窗口,所以你可以通过将访问 token 添加到 localStorage 将其传递回你的主页。请记住我们如何在您的主页上创建一个事件监听器来监视 localStorage,以便您知道它何时存在。这是您希望在回调页面上使用的代码示例(它使用了一些 jquery,但有常规的 JS 方法可以在页面加载时执行操作):

#In spotifyLoginFinish.html's <script>:
$('document').ready(function(){
//i leave 'parseHash()' as an exercise for the reader, all it does is take the uri string(see above ex of what this looks like) and get the access_token from it
var spotifyAccessToken = parseHash(String(window.location.hash));
//you must clear localStorage for main page listener to trigger on all(including duplicate) entries
localStorage.clear();
localStorage.setItem('accessToken', spotifyAccessToken);
window.close();
});

现在您的弹出窗口已自行关闭,您又回到了主窗口,在本文第一段代码的 localStorage 事件监听器函数中。它将从 localStorage 获取 token ,一切就绪!希望这对您有所帮助,如果不起作用,请发表评论。

关于python - 我如何处理 Django 中的 spotify api 身份验证重定向 uri?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38133520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com