質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

339閲覧

【spotipy】ログインしたユーザーではなく、client idと紐づいたアカウントのデータにアクセスしてしまう

Li_

総合スコア1

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/12/30 08:59

編集2023/01/02 04:06

前提

Flask上で、Spotifyの非公式API、spotipyでログイン認証をしたい。ログイン後、そのユーザーのライブラリ情報を取得したいが、代わりにClient idと紐づいたアカウントのデータを取得してしまう。

根本の原因は、以下のコードでtoken_infoとtoken_testの返り値が同じであるからだと考えられる。

sp_oauth = create_spotify_oauth() code = request.args.get('code') token_info = sp_oauth.get_access_token(code) token_test = sp_oauth.get_access_token()

get_access_tokenに与えた引数、codeはログインしてFlaskアプリ上に戻ってきた時のURLから取得。

ためしたこと

ドキュメントを見ると、
get_access_token(as_dict=Truecheck_cache=True)

If a valid access token is in memory, returns it Else feches a new token and returns it
と書いていたので、なんとなく.cacheを消した。

すると、ログイン後、認証URLを複数のタブで開き、一つタブを消すたびにもう一つ開くというよくわからない挙動を始めた。

なぜ.cacheができて、何のために使われているかあまりわかっていません。中身は、token_infoと同じでした。

実現したいこと

ログインしたユーザのデータにアクセスできるようにしたい。そのためには、get_access_token(code)でログインしたユーザのトークン情報が取得できればいいと思われる。

よろしくお願いいたします。

追記

以下に実際に書いたコードから、最小のコードフローだけを取り出したものを置きます。
https://github.com/asparagusv/spotify_review/tree/main

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Demerara

2022/12/30 11:01

ドキュメントを見ると、3 種類の get_access_token() メソッドがありますが、自身が利用しているメソッドの基底クラスはどれか把握されてますか?クラスによって、渡す引数も返す値も異なります。 code という引数を取れるのは、spotipy.oauth2.SpotifyOAuth() か spotipy.oauth2.SpotifyPKCE() のようです。
Li_

2022/12/30 13:02

基底クラスというのは全く把握してなかったです。今回の場合、spotipy.oauth2.SpotifyOAuth()が基底クラスでした。
Demerara

2022/12/31 05:15 編集

ドキュメントによると、spotipy.oauth2.SpotifyOAuth() を基底クラスに持つ get_access_token() メソッドは get_access_token(code=None, as_dict=True, check_cache=True) という引数を取ることがわかります。 つまりその場合、token_info と token_test の返り値が同じになるのは、code の値が None である場合のみです。 ということで、今回の原因は request.args.get('code') が失敗していることにあると思います 全体のコードとエラー出力の内容を公開可能な範囲で公開して頂かない限りこれ以上は答えようがありません。
Li_

2023/01/02 04:13

コードを追加しました。 if文で、codeがNoneでない場合にのみ、token_test, token_infoを生成しているので、他が原因ではないのかなと思っています。
Demerara

2023/01/02 05:25

コード確認しました。何となく把握できました。 これは Spotipy のドキュメントが説明不足かもしれませんね。Spotipy のソースコードを見ると、get_access_token() は code が提供されればトークンを返し、提供されなければキャッシュからトークンを読み込む。どちらもなければ、ブラウザで認証画面を開く、という仕様になってます。 今回の場合、クッキーにトークンを保存してるので、クッキーを削除しない限りログインした状態なのに、なぜか認証画面が表示されるという現象に陥ってるものと思われます。 となると、キャッシュされたトークンが存在しているかを確認し、存在しなければ新しいトークンを生成。このどちらかが成功した場合のみ、クッキーに情報を保存。どちらも失敗した場合は、クッキーの情報を削除して、認証画面を表示する。ってことですかね。 どちらにしろ一度ソースコードを確認してみた方がいいかもしれません。ドキュメントに書かれてない情報が結構ありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問