2014-11-04 2 views
1

Итак, я пытаюсь создать поток авторизации с помощью Spotify Web API. Итак, первый вызов - это просто GET против URL-адреса, и я передаю учетные данные и другие материалы, необходимые для авторизации моего приложения в качестве параметров. После этого пользователю предлагается авторизовать мое приложение, а затем перенаправляется на URL обратного вызова.Python Spotify OAuth Flow

URL-адрес, на который я перенаправлен, содержит некоторые данные отклика в качестве параметров, и мне нужны эти данные для POST в отношении API и получения токена.

Как получить URL-адрес ответа и получить доступ к этим параметрам? Извините за наивный вопрос. Заранее спасибо.

+0

У вас есть веб-сервер, прослушивающий URL-адрес обратного вызова? – ranman

+0

Хммм. Ну, я не уверен, что вы имеете в виду с «прослушиванием веб-сервера». URL-адрес обратного вызова - это мой персональный домен веб-сайта, связанный с моим собственным сервером. Есть ли способ настроить мой сервер для захвата этих данных, чтобы я мог его получить? – whoisjuan

+0

Да, так что, вероятно, происходит, что служба API отправляет информацию обратно на ваш URL обратного вызова. С какими услугами вы пытаетесь пройти аутентификацию? – ranman

ответ

3

Я не верю, что вы можете сделать это с помощью только запросов.

Я хотел бы проверить пакет, как: https://flask-oauthlib.readthedocs.org/en/latest/

from flask import Flask, redirect, url_for, session, request 
from flask_oauthlib.client import OAuth, OAuthException 


SPOTIFY_APP_ID = 'REGULAR_CODE' 
SPOTIFY_APP_SECRET = 'SECRET_CODE' 


app = Flask(__name__) 
app.debug = True 
app.secret_key = 'development' 
oauth = OAuth(app) 

spotify = oauth.remote_app(
    'spotify', 
    consumer_key=SPOTIFY_APP_ID, 
    consumer_secret=SPOTIFY_APP_SECRET, 
    # Change the scope to match whatever it us you need 
    # list of scopes can be found in the url below 
    # https://developer.spotify.com/web-api/using-scopes/ 
    request_token_params={'scope': 'user-read-email'}, 
    base_url='https://accounts.spotify.com', 
    request_token_url=None, 
    access_token_url='/api/token', 
    authorize_url='https://accounts.spotify.com/authorize' 
) 


@app.route('/') 
def index(): 
    return redirect(url_for('login')) 


@app.route('/login') 
def login(): 
    callback = url_for(
     'spotify_authorized', 
     next=request.args.get('next') or request.referrer or None, 
     _external=True 
    ) 
    return spotify.authorize(callback=callback) 


@app.route('/login/authorized') 
def spotify_authorized(): 
    resp = spotify.authorized_response() 
    if resp is None: 
     return 'Access denied: reason={0} error={1}'.format(
      request.args['error_reason'], 
      request.args['error_description'] 
     ) 
    if isinstance(resp, OAuthException): 
     return 'Access denied: {0}'.format(resp.message) 

    session['oauth_token'] = (resp['access_token'], '') 
    me = spotify.get('/me') 
    return 'Logged in as id={0} name={1} redirect={2}'.format(
     me.data['id'], 
     me.data['name'], 
     request.args.get('next') 
    ) 


@spotify.tokengetter 
def get_spotify_oauth_token(): 
    return session.get('oauth_token') 


if __name__ == '__main__': 
    app.run() 
+0

Спасибо, человек! Отлично! Я очень ценю это! – whoisjuan

+1

Эй, спасибо, спасибо за решение. Я реализовал его, но я получил эту ошибку в фляге: «ValueError: объект JSON не может быть декодирован». Так что я как бы застрял в этом исключении. Я ожидал увидеть рендеринговую страницу, рассказывающую мне «Записан как id **** имя ***** и т. Д.», Поэтому я не знаю, действительно ли я получаю токен. Я также не очень уверен, как я могу передать этот токен другому сценарию. Любая помощь будет сохранена. Приветствую. – whoisjuan

0

Вы можете получить ответ в формате JSON со всеми параметрами, которые вам нужны, пример.

Вы войдите в www.example.com/login/

ПОЛУЧИТЬ http://www.example.com/login/ (с заголовком и базовой аутентификацией доступа или процессом Идента, который вы используете), и этот URL возвращает JSON ответ с данными:

{ 
    'status': 'OK', 
    'token': { 
    'public_token': 'blabla', 
    'private_token': 'blabla'}, 
    'created_at': '2014-11-03' 
} 

Эти данные можно сохранить в базе данных для будущего использования.

Смежные вопросы