風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

Google App Engineのデプロイ時に認証エラーがでる場合の対策

久しぶりに GAE のアプリケーションをいじった後で、デプロイしようとすると、

Password for username: Use an application-specific password instead of your regular account password.
See http://www.google.com/support/accounts/bin/answer.py?answer=185833
However, now the recommended way to log in is using OAuth2. See
https://developers.google.com/appengine/docs/python/tools/uploadinganapp#Python_Password-less_login_with_OAuth2
2015-03-14 09:00:00,000 ERROR appcfg.py:2448 An error occurred processing file '': HTTP Error 401: Unauthorized. Aborting. 
Error 401: --- begin server output ---
Must authenticate first.
--- end server output ---

のようなエラーが出てしまった。


どうやら、アプリケーションパスワードを取得するか、OAuth2 認証を使用しろ、ということらしい(推奨はOAuth2)。


アプリケーションパスワードを取得して使用する場合には Google App Engine Launcher でもそのまま使えるが、OAuth2 認証の方だと Launcher で使用する方法が見つからなかった。コマンド プロンプトから appcfg.py を使用するしかないのかも。

アプリケーションパスワードを取得して使用する場合

エラーメッセージ内で指示されているSign in using App Passwords - Accounts Helpに書かれている通り、アプリ パスワードのページに行き、必要に応じてアプリケーションで使用しているGoogleアカウントでログイン後、アプリ パスワード(16文字)を生成する。
『端末を選択』の項目は使用している端末を選択または入力(『Windows パソコン』等)、『アプリを選択』はその他『(名前を入力)』を選んで適当な名前(『Google App Engine』など)を付ければよい。

表示されたアプリ パスワード(スペースは含まない16文字)は、他人に知られないように覚えるかメモしておく。
「このパスワードを覚えておく必要はないので……」とか書かれているが、覚えておく必要、あるよ……。


取得したアプリ パスワードは、これまで使っていたユーザーパスワードの代わりに、デプロイ時に指定する(emailはそのまま使用する)。

OAuth2 認証を使用する場合

エラーメッセージ内で指示されているPassword-less Login with OAuth2に従って、コマンド プロンプトより、

appcfg.py --oauth2 update myapp/

とする。
myapp/ は、自分のアプリケーションのフォルダを指定。
設定によっては、appcfg.py だけだと実行できないかもしれない。その場合は「python "C:\Program Files (x86)\Google\google_appengine\appcfg.py"」のようにフルパス指定して実行する。
すると、ブラウザで認証画面が開くので、画面の指示に従って認証すれば、デプロイすることが出来る。


いちいち認証手順を行いたくない場合、2回目以降は、

appcfg.py --oauth2_refresh_token=<token> update myapp/

のように token を指定して実行すればよい。


この token は、ユーザーフォルダ(%UserProfile%)にある .appcfg_oauth2_tokens に記述されているので、これをコピーして使う。

type %UserProfile%\.appcfg_oauth2_tokens

として、表示されたデータ(JSON形式)のうち、

...  "refresh_token": "<token>", ... 

のようになっている refresh_token を使用する。