Что мне делать с uri перенаправления аутентификации Spotify api в Django?

Я создал приложение на Django, которое использует Spotipy, библиотеку Python Spotify API, и использует команду spotipy.util.prompt_for_user_token() как таковую для создания токена и доступа к моей частной библиотеке как таковой:

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"

Я бы хотел, чтобы приложение имело логин в пользовательском интерфейсе вместо жестко заданного логина, но я не могу понять, как это сделать.

На данный момент у меня есть кнопка входа в систему, которая пытается вызвать перенаправление страницы входа через 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/


person Ryan Finley    schedule 30.06.2016    source источник
comment
Вы нашли для этого решение?   -  person Caaarlos    schedule 21.09.2016


Ответы (1)


Чтобы реализовать это, я полностью отказался от модуля spotipy и просто использовал javascript. Я вижу, что вы используете поток API авторизации пользователей, и это нормально, потому что ваш сервер может безопасно отправлять секретный ключ. При перемещении этого во внешний интерфейс вашего приложения вы не можете этого сделать и вместо этого должны использовать Поток неявного предоставления:

#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:

#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 или нет, но есть несколько способов вызвать функцию JS при загрузке страницы. Итак, теперь все, что вам нужно сделать, это проанализировать URI после загрузки страницы обратного вызова, и вы можете получить свой токен доступа. Затем вы закончили с этим всплывающим окном обратного вызова, поэтому вы можете передать токен доступа обратно на главную страницу, добавив его в 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, и все готово! Надеюсь, это поможет, прокомментируйте, если это не сработает.

person stackPusher    schedule 24.02.2017
comment
Привет! У вас есть предложение, как после получения токена доступа, установленного в хранилище, искать песни? У меня есть функция поиска, которая запускается, когда я нажимаю кнопку поиска. Могу ли я просто скопировать и вставить его туда, где он говорит: // делать что-то с API Spotify, используя здесь свой токен доступа !!? Что ты вложил в эту часть - person user2030942; 30.08.2017
comment
Мне особенно интересно узнать, как использовать эту часть кода, поскольку я уже смог получить токен доступа, хранящийся в localstorage. Я просто не знаю, куда с этим деваться: window.addEventListener("storage", function(event) { if (event.key == "accessToken") { var spAccessToken = event.newValue; //do things with spotify API using your access token here!! } }) - person user2030942; 30.08.2017
comment
@ user2030942 Получив токен доступа, вам нужно обратиться к документации Spotify Api и посмотреть на различные доступные конечные точки. Если вы пытаетесь найти песню, возможно, вам нужна конечная точка поиска: разработчик .spotify.com / web-api / search-item Вы отправите GET-запрос на эту конечную точку. Ваш запрос будет включать ваш токен в заголовок и параметры поиска в URL. Документация скажет вам, какой формат ответа вы можете ожидать в ответ. В документации есть примеры кода, но если их недостаточно, опубликуйте новый вопрос и свяжите его здесь, я попытаюсь ответить. - person stackPusher; 30.08.2017