仕事と家事で毎日バタバタ…
ずぼら主婦さゆです。
単身赴任中の夫、わたし、3歳娘の
3人家族
このブログでは
なるべくラクに家計をやりくりする方法
節約しつつプチ贅沢を楽しむコツ
夢のマイホーム実現に向けた情報
を発信していきます!
いいねやコメントもらえると
嬉しいです![]()
ご訪問ありがとうございます。
こんにちは!さゆです。
前回から続いている
「アプリにアクセスを許可できません」
エラーとの格闘、ついに進展がありました💦
3日間、もう心が折れそうになりながらも
ChatGPTさんと一緒に頑張った結果が...!
📝設定見直しの提案をもらいました
ChatGPTから具体的なチェックポイントを教えてもらいました✨
さゆ:
「何度やっても同じだね。問題が発生しました。アプリにアクセスを許可できません。前に戻ってもう一度ログインしてください。」
ChatGPT:
「エラー『アプリにアクセスを許可できません』が繰り返し出てしまう原因は、X Developer Portalでのアプリ設定に何らかの不備がある可能性が高いです。特に以下の点を確認・修正してみてください:
________________________________________
✅【1】Callback URLの修正(最重要)
現在の設定:https://localhost/
これはローカル開発用であり、X側が制限している場合があります。
🔧以下のような、実在するウェブサイトURLに変更してみてください:
https://yourdomain.com/callback
※もしご自身のWebサイトをお持ちでなければ、以下のような無料のURLを使ってテストも可能です(最終的には調整が必要ですが):
• https://example.com/callback
• https://127.0.0.1/callback(←localhostの代わりにIPアドレスを使う手も)
________________________________________
✅【2】Client ID / Client Secret の有効性
再生成した CLIENT_SECRET を使っていてもエラーが出る場合:
• 前回のクライアント情報がキャッシュされている可能性もあります。
• 一度、クライアントを削除して作り直すのが確実な手段です(面倒ですが成功率は高いです)
________________________________________
✅【3】「Type of App」や「Permissions」が合っているか再確認
必ず以下のように設定してください:
• App permissions:Read and write
• Type of App:Web App, Automated App or Bot
• Callback URL:実在するURL(例:https://yourdomain.com/callback)
________________________________________
✅【4】URLを生成するPythonコードの確認
URLを生成しているPythonコード(auth_step1.py)で redirect_uri が "https://localhost/" になっていれば、それも一致するように修正してください。
________________________________________
もしよければ、
• 現在の「User Authentication Settings」のスクショ(ぼかし可)
• auth_step1.py のコード内容
を共有いただければ、具体的にどこを直せばいいかピンポイントでアドバイスできますよ。無理な範囲は共有不要です🙆♀️」
さゆ:
「アプリ設定はこんな感じです:
App permissions:Read and write
Type of App:Web App, Automated App or Bot
Callback URI:https://127.0.0.1/callback」
ChatGPT:
「完璧です!その設定で保存すれば、OAuth 2.0 認証の「アプリにアクセスを許可できません」エラーは解消されるはずです✨」
😤でも...まだエラーが続く
設定を保存して再実行したのに...😱
問題が発生しました
アプリにアクセスを許可できません。前に戻ってもう一度ログインしてください。
この時、正直「もうダメかも...」って思いかけました💦
さゆ:
「何度やっても同じだよ。」
ChatGPTの新提案:「Native App」に変更!
ChatGPT:
「ここまでの設定はばっちりだから、あと一歩!落ち着いて、以下のポイントを一緒に確認しよう👇
________________________________________
✅ このエラーの原因は、設定のどこかがTwitter側の要件と合っていないためです。
「アプリにアクセスを許可できません」というエラーは、redirect_uri の不一致かアプリの種類/認証種別のミスマッチがほとんどの原因です。
________________________________________
🔍 原因チェックリスト(最新版)
① Callback URI(Redirect URI)
• 現在設定:https://127.0.0.1/callback ✅ OK(←今のコードと一致している)
• Twitter側にも https://127.0.0.1/callback と正確に登録されているか確認して!
• http ではなく https である必要がある(意外と重要)
________________________________________
② アプリの種類(Type of App)
現在は「Web App, Automated App or Bot」を選んでいるね。
これは 正しい選択肢です。ただし、これを選んだ場合は 「Confidential Client」 扱いになります。
👉 それに応じて 認証コードの取得も code_challenge などが必要になることも。
________________________________________
✅ 対処法(推奨):アプリの種類を「Native App」に変更してみよう!
📌 なぜ?
「Native App」は簡略化されたフローを使えて、ローカル開発(127.0.0.1)との相性がいいです。
________________________________________
✅ 変更手順
1. X Developer Portalのアプリ設定ページへ
2. 「User authentication settings」をクリック
3. 以下を変更:
• App permissions:✅「Read and Write」
• Type of App:🔄「Native App」 に変更!
• Callback URL:✅ https://127.0.0.1/callback
• Website URL:✅ https://example.com(ダミーでOK)
4. ⏬ Save をクリック
________________________________________
✅ その後、再び auth_step1.py を実行してみて
python auth_step1.py
URLが表示されたらクリックして、ログイン~許可の流れをやってみてね!
________________________________________
💬 うまくいけば:
• 「許可しますか?」の画面が出て、ログインできるようになるはず!
• ブラウザのURLバーに https://127.0.0.1/callback?code=xxxxx... というURLが表示されるはず!
________________________________________
進めたら「変更したよ!」と教えてください😉
そこから次の認証ステップに進もう!」
🔄設定変更したけど...まさかの結果
今度こそ!っと
実行ボタンを押したら…
このサイトにアクセスできません 127.0.0.1 で接続が拒否されました。 次をお試しください 接続を確認する プロキシとファイアウォールを確認する ERR_CONNECTION_REFUSED
さゆ:
「またまた、エラーっぽいよ?」
ChatGPT:
「大丈夫、これは想定内の挙動です👌💡
実はこのエラー、「認証に成功してリダイレクトされた先に、何もサーバーが立っていないから」表示されているだけ。
つまり:
認証そのものは成功している可能性が高い! 🎉
________________________________________
✅ やるべきこと
❶ ブラウザのアドレスバー(URL)をよく見て!
こんな感じのURLになっていませんか?
https://127.0.0.1/callback?code=abc1234XYZ567&state=xxxxx
👉 この中の code=xxxxx... の部分が 認証コードです!
________________________________________
❷ 「code=」以降の文字列を コピー してください
例:
code=abc1234XYZ567 → この「abc1234XYZ567」が必要!」
😲えっ!?成功してたの?
ChatGPTに「ブラウザのアドレスバーを見て!」って言われて確認したら...
https://127.0.0.1/callback?error=invalid_request&state=0mi9HMiy...
あれ?エラーの文字が😅
ChatGPTの新しいアドバイス
ChatGPT:
「ありがとう、URL確認しました。
これは明確に「認証コード(code)が返ってきていない」=認証に失敗しているという状態です💧
________________________________________
❌ エラーの意味:「invalid_request」
このエラーが表示されるときは、設定やリクエストの形式にミスがあるのが原因です。
________________________________________
✅ 原因として最も可能性が高いのはこれ:
「code_challenge / code_verifier」が含まれていない
(OAuth 2.0 PKCE 認証の要件を満たしていない)
OAuth2Session を使って認証URLを生成する場合、Twitterの認証フローでは**PKCE(Proof Key for Code Exchange)**が必須です。
________________________________________
🛠️ 解決策:OAuth2Session で code_challenge_method='S256' を明示しよう
以下のようにコードを修正してください👇
import os from dotenv
import load_dotenv from requests_oauthlib
import OAuth2Session from oauthlib.oauth2
import BackendApplicationClient import secrets
# .envファイルの読み込み
load_dotenv()
# 環境変数から読み込み client_id = os.getenv("CLIENT_ID") redirect_uri = "https://127.0.0.1/callback"
# PKCEの code_verifier(ランダム文字列を生成)
code_verifier = secrets.token_urlsafe(64)
# セッション作成(PKCE対応)
oauth = OAuth2Session( client_id=client_id, redirect_uri=redirect_uri, scope=["tweet.read", "tweet.write", "users.read", "offline.access"], code_challenge_method="S256" )
# 認証URLの生成(code_challenge を含めて)
authorization_url, state = oauth.authorization_url( "https://twitter.com/i/oauth2/authorize", code_challenge=code_verifier # ここ大事! )
# 認証URL表示 print("🔑 以下のURLにアクセスして、認証コードをコピーしてね:\n")
print(authorization_url)
# code_verifier をファイルなどに一時保存(step2で使うため)
with open("code_verifier.txt", "w") as f: f.write(code_verifier)
________________________________________
✅ 次のステップ
1. このコードで auth_step1.py を上書きして実行
2. 表示されたURLを開いて、ログイン&許可
3. 今度こそ code=xxxxxx が返ってくるURLがブラウザに表示されるはず✨
4. それを使って auth_step2.py に進めます(※その際は code_verifier.txt の内容を使います)
________________________________________
準備できたら「URL表示されたよ!」「認証コード取れたよ!」と教えてください😊」
🛠️新しいコードに挑戦!
もらったプログラムをに上書きして実行したものの…
TypeError: Session.__init__() got an unexpected keyword argument 'code_challenge_method'
さゆ:
「なんかエラーになった。 」
ChatGPT:
「ありがとう、エラー内容しっかりキャッチできてるよ!
このエラー👇は「code_challenge_method は requests-oauthlib では直接渡せない」という意味です。
________________________________________
✅ 解決方法:手動でPKCEの code_challenge を生成してURLに追加する
TwitterのOAuth 2.0 認証では [PKCE (Proof Key for Code Exchange)] が必須なのですが、requests-oauthlib は code_challenge_method="S256" を直接渡す機能に未対応です。
そこで、手動で code_verifier → code_challenge を生成して、URLに組み込みます。
________________________________________
✨ 修正版コード(100%動くPKCE対応版)
import os
import secrets
import hashlib
import base64 from urllib.parse
import urlencode from dotenv
import load_dotenv
# .envファイル読み込み
load_dotenv()
client_id = os.getenv("CLIENT_ID")
redirect_uri = "https://127.0.0.1/callback"
# ① PKCE用の code_verifier を生成(43〜128文字)
code_verifier = secrets.token_urlsafe(64)
# ② code_challenge を S256(SHA256 + base64url)で生成
code_challenge = hashlib.sha256(code_verifier.encode("utf-8")).digest()
code_challenge = base64.urlsafe_b64encode(code_challenge).rstrip(b"=").decode("utf-8")
# ③ スコープとパラメータをURLに追加
params = {
"response_type": "code",
"client_id": client_id,
"redirect_uri": redirect_uri,
"scope": "tweet.read tweet.write users.read offline.access",
"state": secrets.token_urlsafe(16),
"code_challenge": code_challenge,
"code_challenge_method": "S256"
}
# ④ 認証URL生成
authorization_url = "https://twitter.com/i/oauth2/authorize?" + urlencode(params)
print("🔑 以下のURLにアクセスして、認証後にブラウザに表示されるURLをコピーしてください:\n")
print(authorization_url)
# ⑤ code_verifier をファイル保存(step2で使用)
with open("code_verifier.txt", "w") as f: f.write(code_verifier)
🎉ついに認証コードをゲット!
ChatGPTがくれた最新コードをドキドキしながら実行💓
すると…
https://127.0.0.1/callback?state=zWl8IhbrhnCUeEFatrc5nQ&code=WnRKN2Q0VWxZcEdVS1d2cmNZd1lPX0...
さゆ:
「もしかして、これは成功?」
ChatGPT:
「よく頑張りました👏
そのURLに含まれている code パラメータがまさに「次のステップ」で使う 認可コード(authorization code)です!」
今回の学び✏️
✅ 認証コード(Authorization Code)
→ Xに「この人は本当にアプリを使って良い人ですよ」って証明するもの🎫
✅ PKCE(ピクシー)
→ より安全に認証するための追加のセキュリティ仕組み🔐
✅ OAuth 2.0
→ アプリがXにアクセスするための安全な認証システム🛡️
次回予告🚀
次回は
わたしみたいにPC音痴でも
同じようにプログラミングや技術的なことに
🛍️集中力UPや気分転換に!
特に疲れた時には
\ChatGPT活用本/
わたしがChatGPTとの付き合い方を
学んだ入門書です📚
初心者でも分かりやすく
実践的な使い方が満載!
💡 こんなあなたにおすすめ
・ChatGPTを初めて使う方
・効果的な質問の仕方を知りたい方
・日常生活で活用したい方
\Logicool ワイヤレスマウス M575S トラックボール/
長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨
💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方
山善 昇降式デスク
\スタンディングデスク 幅120cm/
立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠
💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方
楽天ROOMでは
「買ってよかったものだけを載せています。
最後まで読んでくださって
ありがとうございます✨
フォローや「いいね」もらえると
すっごく励みになります♪
それではまた![]()






