久しぶりに 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 を使用する。