ユーザーを認証して得たトークンを保存する必要があります。 は、ユーザーのセッションを使用していると言う:
- ユーザーAログの
- あなたがアクセスを取得し、ユーザA
- あなたはユーザーAのセッションにこれらのトークンを保存するためにトークンを更新します。
- ユーザBログに。
- あなたはアクセスを取得し、ユーザB
- あなたはユーザーBのセッションにこれらのトークンを保存するためにトークンを更新します。
これは、すでにユーザーセッションを実装したのと同じ方法で行います。 したがって、ユーザーがあなたのリダイレクトURIに到達すると、受け取ったトークンをセッションに保存します。 Spotify APIを使用する必要がある場合は、ユーザーセッションで保存されたトークンを使用します。
しかし、これを1人のエンドユーザーに実行したい場合は、Webサーバーを使用すると少し難しくなります。 しかし、CLIアプリケーションを使用すると、やや簡単になります。
ユーザーAとBをアプリケーションにログオンし、両方のトークンを手動で個別に保存することで、実行したい操作を実行します。 これは、2回コールして結果を2つの変数に保存する認証機能を作成するのと同じくらい簡単です。 その後、保存したトークンを使用してAPIを呼び出すことができます。 ユーザーAの保存したトラックを取得する場合は、ユーザーAのトークンを使用します。
Requestsを使用して、ユーザのトラックとユーザ情報を異なるスコープで取得する、Python 3の低レベルの実装例です。コメントがコードの部分である場合authorization code flow:
import time
import urllib.parse as parse
import webbrowser
import requests
from requests.auth import HTTPBasicAuth
OAUTH_AUTHORIZE_URL = 'https://accounts.spotify.com/authorize'
OAUTH_TOKEN_URL = 'https://accounts.spotify.com/api/token'
# Change to your application settings
class Settings:
client_id = ''
client_secret = ''
redirect_uri = ''
def authenticate(scope=None):
'''Implement OAuth 2 Spotify authentication'''
# Application: Request authorization to access data
payload = {'client_id': Settings.client_id,
'response_type': 'code',
'redirect_uri': Settings.redirect_uri,
'show_dialog': 'true'} # allow second account to login
if scope:
payload['scope'] = scope
auth_url = '{}?{}'.format(OAUTH_AUTHORIZE_URL, parse.urlencode(payload))
# Spotify: Displays scopes & prompts user to login (if required)
# User: Logs in, authorizes access
webbrowser.open(auth_url)
response = input('Enter the URL you were redirected to: ')
code = parse.parse_qs(parse.urlparse(response).query)['code'][0]
payload = {'redirect_uri': Settings.redirect_uri,
'code': code,
'grant_type': 'authorization_code'}
if scope:
payload['scope'] = scope
# Application: Request access and refresh tokens
# Spotify: Returns access and refresh tokens
auth = HTTPBasicAuth(Settings.client_id, Settings.client_secret)
response = requests.post(OAUTH_TOKEN_URL, data=payload, auth=auth)
if response.status_code != 200:
response.raise_for_status()
token_info = response.json()
token_info['expires_at'] = int(time.time()) + token_info['expires_in']
token_info['scope'] = scope
return token_info
if __name__ == '__main__':
user_a = authenticate(scope='user-library-read')
user_b = authenticate(scope='user-read-email user-read-private user-read-birthdate')
print('user_a', user_a)
print('user_b', user_b)
for url in ['https://api.spotify.com/v1/me/tracks',
'https://api.spotify.com/v1/me']:
for user in [user_a, user_b]:
token = 'Bearer ' + user['access_token']
# Application: Uses access token in requests to Web API
# Spotify: Returns request data
r = requests.get(url, headers={'authorization': token})
if r.status_code != 200:
print(r.text)
else:
print([
'{}: {}'.format(key, str(value)[:20])
for key, value in r.json().items()
])