首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用spotify api身份验证重定向Django中的uri?

如何使用spotify api身份验证重定向Django中的uri?
EN

Stack Overflow用户
提问于 2016-06-30 21:24:30
回答 1查看 5.5K关注 0票数 5

我在Django中构建了一个应用程序,它使用Spotipy,一个Spotify API,并使用spotipy.util.prompt_for_user_token()命令生成一个令牌并以这样的方式访问我的私有库:

代码语言:javascript
运行
复制
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触发登录页的重定向,方法是使用用户名参数调用上述代码,但它将打开一个新页面,控制台中有以下内容:

代码语言: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/

EN

Stack Overflow用户

发布于 2017-02-24 16:39:58

为了实现这一点,我最终放弃了spotipy模块,只使用javascript。我看到您使用的是用户授权api流,这很好,因为您的服务器可以安全地发送秘密密钥。当将它移到应用程序的前端时,您不能这样做,而必须使用隐式格兰特流:

代码语言:javascript
运行
复制
#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视图。让该视图加载一个回调页,其唯一目的是从其URI收集访问令牌:

代码语言:javascript
运行
复制
#in your views.py:
def callback(request):
    return render(request, 'YourApp/spotifyLoginFinish.html',{})

当该页面加载时,在弹出窗口中,它的URI将包含您所寻求的授权,例如:http://www.example.com/callback/#access_token=BQDoPzyrkeWu7xJegj3v1JDgQXWzxQk2lgXrQYonXkXIrhmjeJVS38PFthMtffwlkeWJlwejkwewlHaIaOmth_2UJ2xJrz2x-Voq0k0T0T4SuCUdIGY3w3cj5CpULkFla9zwKKjvdauM2KoUIQa1vULz-w8Da83x1&token_type=Bearer&expires_in=3600&state=123

如果您正在使用jquery或不使用jquery,那么可以通过多种方法在页面加载时调用JS函数。所以现在您所需要做的就是在回调页加载之后解析URI,然后您就可以获得访问令牌了。然后,您就完成了这个弹出回调窗口,这样您就可以通过将访问令牌添加到localStorage将访问令牌传递回您的主页。请记住,在您的主页上,我们创建了一个事件侦听器来监视localStorage,这样您就可以知道它何时出现了。下面是您希望在回调页面上使用的代码示例(它使用了一些jquery,但是有一些常规的JS方式来处理页面加载中的内容):

代码语言:javascript
运行
复制
#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获得令牌,您已经准备好了!希望这有帮助,如果它不起作用,请发表评论。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38133520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档