IT系おじさんのチラシの裏
2018年10月~
当サイトの記事にはアフィリエイト広告のリンクが含まれる場合があります

GmailでIMAPが使えなくなるので自作プログラム用に認証キーを取得する

Googleから突然、「5月30日より、安全性の低いログイン技術を使用するアプリにアクセスできなくなる可能性があります」というメールが届き、困惑している方もいるのではないでしょうか?

GmailでIMAPが使えなくなるぞという警告メール

たぶんこれはGmailをPOP3やIMAP接続で使っている人にだけ送られるメールだと思います。実際、ぼくは複数のGmailアカウントを持っていますが、この注意喚起メールが届いたのは一部のメールアドレスだけであり、そのアカウントはたしかにIMAP接続で使っているモノでした。

以前から企業向けのGmailではOAuth認証が推奨されていたようですが、とうとう全部のGmailでPOP3やIMAP等のユーザーIDとパスワードの組み合わせだけでログインする仕組みは使えなくするようです。

これは困った。うちはWeb管理等にGmailを利用しており、運営サイトの問い合わせフォームの送信先としてはもちろんのこと、デバッグ用のメールなどもGmailで受け取ります。ほとんどは手動でチェックしますが、一部、プログラムで自動チェックして、そのメール本文を解析する仕組みなども導入しているため、そこではIMAP接続を使っているのでした。

これが2022年5月30日から使えなくなる、というのです。OAuth2.0が何なのかはよくわかっていませんが、古くはAmazon AWSのAPIでシークレットキーを使っていますし、TwitterのOAuthのプログラミングは趣味レベルで組んだことがあります。要はお互いに秘密鍵を保存しておいて、その秘密鍵から生成されたトークンを通信で渡すことで認証する仕組みでしょ?

なら、さほど難しいことはあるまい、とさっそくOAuth認証の登録作業を開始したのですが………………これが思ったよりだいぶ面倒くせぇ!!というか、Webページがわかりづらい!!

一応、丸一日かけて認証キーの取得とそのキーを使ったOAuth2.0での認証処理プログラムまで完成しましたが、数週間も経てば絶対忘れる自信があります。

全部まとめるとちょっと長すぎる気がするので、まずこの記事ではGoogle Cloud Platformでの登録処理についてのみ備忘録として残しておきます。

その後、実際のコーディングについてはnodejsあたりで実装したのを別記事としてアップする予定です。

Google Cloud Platformで認証キーを取得する手順

GmailへのIMAP接続はユーザーIDとパスワードの組み合わせだけで済みましたが、OAuth認証を行うとなると、Googleへのアプリ登録と認証キーの発行が必要です。

そのため、まずは下記のGoogle Cloud Platformを開き、開発用として使うGoogleアカウントでログインします。

https://console.developers.google.com/

開発用のGoogleアカウントとOAuth認証したいGmailアカウント(Gmailアドレス)は別々でも構いません。

Google Cloud Platformの最初の画面

Google Cloud Platformの最初の画面

しょっぱなから、「あー…これ面倒くさそうなやつだ…」と感じましたが、「このページを表示するには、プロジェクトを選択してください」とあるように、何をするにしてもプロジェクトが作られていないとダメなようです。

画面右側に「プロジェクトを作成」という青字のリンクがあるのでそこをクリックします。

新しいプロジェクト

新しいプロジェクト

プロジェクト名って何だよ…そもそもプロジェクトってなんなんだよ… わいは自分のGmailへ自分のプログラムでアクセスしたいだけなんや… などと呪詛を吐きながら、特にコダワリもないのでデフォルトで設定されているテキトーなプロジェクト名のまま[作成]ボタンをクリックします。

APIとサービス画面から「ライブラリ」を選択

APIとサービス画面から「ライブラリ」を選択

プロジェクトを作成した後、いきなりこの画面が現れて途方に暮れるものの、数十分いろいろ操作をして少し理解しました。

Gmail用の認証キーが欲しければライブラリにGmail APIを追加する必要がある、ということです。その理由については後述します。

というわけで、左メニューから「ライブラリ」をクリック。

ライブラリの一覧から「Gmail API」を選択

ライブラリの一覧から「Gmail API」を選択

なんか色んなAPIあってすごいっすねー(棒) さすがGoogleさんっすねー(棒) と死んだ魚の目をしながら「Gmail API」をクリックします。

Gmail APIを「有効にする」

Gmail APIを「有効にする」

[有効にする]ボタンをクリックしてしばらくすると、そのボタン名が「管理する」に変わるはずなので、それを無我の境地でクリックします。

Gmail APIの概要画面

Gmail APIの概要画面で[認証情報を作成]をクリック

いろんな導線が絡み合っていて、認証情報の作成画面へ遷移する道筋はひとつじゃありませんが、運よくスムーズに上記画面にたどり着けたなら、ここで[認証情報を作成]ボタンをクリックするのが一番わかりやすいと思います。

この時点で迷子になっていたなら、まずはGoogle Cloud Platformのホーム画面に戻ってから左上ハンバーガーメニューを開き、「APIとサービス」→「認証情報」→「認証情報を作成」の流れでも良いです。微妙にデザインが違うけれど、同じことができる画面が出てきます。…………そういうところが素人に優しくない。

認証情報の種類とアクセスするデータの種類

認証情報の種類とアクセスするデータの種類

Gmail APIの画面から認証情報を作成を選んだんだから、デフォルトで「Gmail API」が選ばれていても良さそうなものですが、なぜか選ばれていないので、プルダウンメニューからGmail APIを探して選びます。

アクセスするデータについてはGmailなので「ユーザーデータ」ですね。ユーザーの同意が必要です云々書いてあるのでアプリケーションデータを選びたくなりますが、どのみちメールの一覧を読んだり、本文読んだりするプログラムを作るのだから、機密性の高いデータへのアクセスが必要なプログラムと判断されます。おとなしくユーザーデータを選びましょう。

目立つ青い色の[完了]ボタンがあるのでそこをクリックしたくなりますが、そんなことをしてもフワっとした感じで終わり、なんだか出来たように見えて何も出来ていない状態になるだけなので、赤枠で囲った[次へ]ボタンを押しましょう。

OAuthの同意画面

OAuthの同意画面

アプリ名は同意画面に表示される名称です。同意画面ってなんぞ?と思う方もいるかもですが、最近は「Googleアカウントでログインする」ボタンが付いているWebサイトが増えてきているので、ご覧になった方も多いのではないでしょうか。

Googleアカウントでログインする、を選んだときに出てくる白い窓です。複数Googleアカウントを持っていたら、どれでログインする?みたいに聞いてきて、おい、どこまでこっちのこと知ってるんだよ、とちょっと不安になるあの画面。

その画面で表示されるアプリ名称を決めるわけですが、自分のGmailアドレスに自分のプログラムでアクセスしたいだけなので、「Gmailテスト用」とテキトーな名前を付けました。

ユーザーサポートメールとデベロッパーのメールアドレスはどっちも同じで良いでしょ(鼻ほじ)

ここでも完了ボタンに惑わされず、「保存して次へ」をクリック。

スコープ

スコープ

ページに書いてあるとおり、ユーザーに許可を求める権限を決めます。Androidアプリを開発したことがある方ならお馴染みでしょうし、そうでなくとも、アプリのインストール時に「電話へのアクセスを許可しますか?」「マイクの使用を許可しますか?」みたいに細かく聞かれた経験があるのではないでしょうか。

アレみたいなもので、Gmailへのアクセスを許可してほしいので、「スコープを追加または削除」ボタンを押します。

選択したスコープの更新

選択したスコープの更新

この一覧から必要な権限を選ぶのですが、すっっっっっっごく多いのでいちいちスクロールして探してられません。

フィルタに「Gmail API」と入力すればGmail関連の権限だけが並ぶので、ここから選びましょう。

メールを読むだけなら「../auth/gmail.readonly」でも良いですが、未読メールを読んだ後に既読にしたい、といった要件があるのなら、「../auth/gmail.modify」権限が必要です。Gmailの既読/未読処理はラベルの付け替え処理と同等だからです。

必要な権限にチェックを入れたら、最後に[更新]ボタンをクリックします。

制限付きのスコープ

制限付きのスコープ

先ほど選んだのが readonly であれ、modifyであれ、おそらく「制限付きのスコープ」の欄に項目が追加されたんじゃないかと思います。

制限付きのスコープがあるアプリを一般公開しようとした場合、必ずGoogleの審査が必要になります。

……………冗談じゃねえ!!www 何度も書いているとおり、自分のGmailアカウントに自分のプログラムでアクセスしたいだけなのです。そんなアプリをいちいち審査してもらう必要もないし、申請なんかしたくない。でも大丈夫。これも後述しますが、テスト用という用途があるので今回はその方法で進めます。

ともあれ、設定内容を確認したら「保存して次へ」。

OAuthクライアントID

OAuthクライアントID

ここではアプリケーションの種類を選ぶのですが、「デスクトップアプリ」を選択します。例えばWebアプリを選ぶとリダイレクト用のURLや、コールバック用のURLを設定するのが面倒だからです。

ほらクレジットカードの3D認証みたいなものですよ。自分のWebサイト→Googleの認証サイト→また自分のWebサイトに戻ってくる、みたいな。Webアプリだとそういう実装方法をするので、アクセス元とリダイレクト先のURLをあらかじめ設定しておき、途中に乗っ取りページなどが入らないようにしているわけですね。

今回はnodejs(JavaScript)でGmailを読むプログラムを作るつもりなので、「デスクトップアプリ」にしました。これなら余計な設定必要ないし。

認証情報をダウンロード

認証情報をダウンロード

これでようやく…よーやく!!認証情報が作成できました。

OAuth2.0の認証に必要な情報は「クライアントID、認証キー、リダイレクトURL」の3つで、デスクトップアプリの場合はリダイレクトURLが不要なので、クライアントIDと認証キーだけです。

なので、そのコードをメモっておくだけでも良いのですが、ここで「ダウンロード」を選び、json形式のファイルをダウンロードしておくと、この後作るプログラムで使えて便利です。

ダウンロードが終わったら今度こそ青字の[完了]ボタンを押します。

認証情報

認証情報

ここまでの手順を踏んで、やっと自分のプロジェクトにOAuth 2.0クライアントの認証情報が作成されました。

ちなみに先ほどjsonファイルのダウンロードを忘れた方でも、この画面右側にあるダウンロードアイコンをクリックすればいつでも認証情報が入ったjsonファイルをダウンロードできますのでご安心を。

テスト運用とテストユーザーの作成

テスト運用とテストユーザーの作成

認証情報を作る途中に何度か話しましたが、Gmailを読むという行為は「機密情報にアクセスするアプリ」という位置付けになるため、おいそれと公開させてはくれません。

というか、自分で使うための自分のアプリを公開なんてせんわ!という話なのですが、OAuthには「公開ステータス」というものがあり、これを「公開」にしないとGoogleアカウントの選択画面(OAuth認証の画面)で「このアプリはGoogleで確認されていません」とか「招待元のデベロッパーを信頼できる場合のみ続行してください」という警告画面が出ます。

そのため、ステータスを試しに公開にしてみたのですが、するとOAuthに制限付きのスコープ(先述した../auth/gmail.modify等)がある場合にはGoogleの審査(4~6週間)が必要との警告が出ました。

いやいや、そこまでして自分用のアプリをわざわざ公開する必要ないっすわ…ということで公開ステータス=テストのまま運用することにしました。

この場合の制限事項としては先ほどの警告画面が出ることと、指定されたテストユーザーしかログインできないこと、そのテストユーザーは最大で100人まで、ということです。

というわけで、この画面で「ADD USERS」ボタンを押し、自分が使うGmailアドレスを追加しておきます。

これで、自分のGmailにアクセスするだけの自分のアプリ、を作る準備が整ったことになります。

………………………あぁ~面倒くさかった。

まとめ

■経緯

  • 2022年5月30日からPOP3やIMAPでGmailへのアクセスが出来なくなる
  • 自作プログラムでIMAP接続しているため、これをOAuth2.0に対応させることにした
  • OAuth2.0に対応するためにはまずGoogle Cloud Platformでアプリの登録と認証情報が必要らしい

■作業の流れ

  1. Google Cloud Platformでプロジェクトを作成
  2. ライブラリにGmailAPIを追加
  3. 認証情報の作成画面からスコープを設定 (../auth/gmail.modify)
  4. OAuthクライアントはデスクトップアプリを選択
  5. 作成された認証情報が入ったJSONファイルをダウンロード
  6. 最後にOAuth同意画面でテストユーザーを追加

これでnodejs(JavaScript)を使ったOAuth認証の準備が整ったので、次回は実際のプログラミングの話をしたいと思います。

つづき

node.jsでGmail APIを使ってメール一覧や本文を取得するサンプル

関連記事

AndroidでSocket通信するサンプル

最近Androidアプリの開発について勉強しているのですが、IPアドレスを指定して電文のやりとりをするプログラムを書いているため、備忘録を兼ねて記事にしておきます。 ソケット通信するためにはパー

コメント

  • 詳細にまとめて頂きありがとうございます。
    非常に助かりました!読み進めるうちの気持ちを代弁してくれているようで、クスっとしましたw
    [返信]
    • 自分でも読み返すのがしんどい記事をここまでお読み頂きありがとうございます。少しでもお役に立てたなら幸いです😊

      ………が、ここまで頑張って作ったテスト用の認証キー、7日に一度リセットされるんですよね…。なんというか、その、軽い気持ちで作ったIMAP経由でGmailを読み取る自作アプリのことなんぞ一切考えられていないのだろうなぁ~と痛感いたしましたw
      [返信]

新しいコメントを投稿する

[新規投稿]
 
TOP