2026年10月2日、YouTubeへの限定公開アップロードが止まりました。
エラーはinvalid_grant: Token has been expired or revokedです。
自分の環境では、Google CloudのOAuth同意画面の公開ステータスが「テスト」のままでした。
ただ、今回の失効の理由そのものは、特定できていません。
🎥 この記事の内容は動画でも解説しています。
先に結論です。
公開ステータスが「テスト」だと、YouTubeにアップロードするためのリフレッシュトークンは7日で切れます。
自分は、公開ステータスを「本番」にして、トークンを取り直しました。
invalid_grantは、トークンの更新をGoogleに拒否されたという意味
今回のようにトークンの更新時に出るこのエラーは、リフレッシュトークンがGoogle側で無効になったときに返ってきます。
同じトークンで再試行しても、解消しません。
トークンを取り直す必要があります。
自分の場合は、動画をアップロードする処理がこのエラーで失敗しました。
動画は、アップロードされていません。
自分がauth_setup.py(自分の認証用スクリプト)を再実行して認証し直すと、アップロードは動きました。
ただ、公開ステータスが「テスト」のままだと、取り直したトークンも7日で切れる仕様があります。
公開ステータスが「テスト」だと、リフレッシュトークンは7日で切れる
Googleの公式ドキュメントによると、公開ステータスが「テスト」のアプリが発行するリフレッシュトークンは、7日で期限切れになります。
例外は、名前・メールアドレス・プロフィールだけのスコープを使う場合です。
YouTubeにアップロードするためのスコープは、この例外に入りません。
自分の環境は「テスト」だったので、取ったトークンは7日で切れる状態でした。
今回のエラーも、この期限切れが原因ではないかと疑っています。
ただ、確認はできていません。
公式には、リフレッシュトークンが失効する条件の例として、7日の期限のほかに、次のものが挙げられています。
- ユーザーがアプリへのアクセス許可を取り消した
- リフレッシュトークンを6か月間使わなかった
- Gmailのスコープを含むトークンで、ユーザーがパスワードを変えた
- 同じOAuthクライアントIDで、1つのGoogleアカウントに発行できるリフレッシュトークンの上限(100個)を超えて新しく発行し、古いものが無効になった
同じinvalid_grantでも、原因はこれらかもしれません。
7日の条件に当てはまるかどうかは、公開ステータスと、トークンを取ってからの日数で絞り込めます。
直し方:公開ステータスを「本番」にして、トークンを取り直す
自分は、Google Cloud Consoleで次の順に設定しました。
- OAuth同意画面の「ブランディング」に、ホームページとプライバシーポリシーのURLなどを入力する
- 公開ステータスを「テスト」から「本番」に変える
auth_setup.pyを再実行して、トークンを取り直す
「テスト」のときに発行したトークンには、7日の期限が残っている可能性があります。
そのため、本番に切り替えたあとはトークンを取り直して、新しいトークンを使っています。
アップロードできることも、確認しました。
本番にしたので、7日の条件では切れない想定です。
ただ、7日を超えて使い続けられたかどうかは、この記事を書いた時点ではまだ確かめていません。
上の4つの条件に当てはまれば、本番でも失効します。
本番にしたあとに残る注意点
- 未審査の本番アプリなので、再認証のときに「確認されていないアプリ」の警告が出る。「詳細」からアプリ名に移動すれば進める
- 未審査のアプリには、利用者数の上限(100人)がある。自分1人なら関係ない
- トークンが長持ちするぶん、漏れたときの影響も長引く。トークンのファイルは、共有したりクラウドに置いたりしないようにしている
自動化が止まったときの、原因の切り分け順
- エラーが
invalid_grantで、トークンの更新時に出ているか。そうなら、まずリフレッシュトークンが無効になっていないかを疑う - OAuth同意画面の公開ステータスが「テスト」か。「テスト」で、トークンを取ってから7日が経っているなら、期限切れの可能性が高い。7日未満なら、ほかの失効条件も確認する
- 「本番」なのに切れたなら、許可の取り消し・6か月の未使用・Gmailスコープでのパスワード変更・トークン数の上限を確認する
- 原因に応じて設定を直し、必要なら
auth_setup.pyのような認証の処理を再実行して、新しいトークンで動かす
まず見るのは、公開ステータスと、トークンを取った日です。