ネイティブアプリでGoogle APIを使うとき、GoogleからOAuth検証の承認を得る必要があるらしいけど、具体的な申請手順と承認を得るためのポイント(注意点)を知りたい。
という方向けの記事です。
アプリからGoogle APIを通じて、Google CalendarやGoogle Driveにアクセスする場合、Google Cloud Platform(以下、GCP)上で設定を行い、ユーザーに同意画面を表示する必要があります。
さらに、そのGoogle APIが、「機密性の高いスコープ」(ユーザーのセンシティブなデータにアクセスすること)に該当していると、同意画面の表示に加え、Googleから問題ないアプリかどうかを事前検証してもらい、承認(OAuth(※)検証の承認)を得ておく必要があります。
先日リリースしたアプリ「かんたんプリント管理」では、機密性の高いスコープのGoogle APIを利用していたため、このOAuth検証をやったのですが、Googleから6回リジェクトされ、本当に大変でした。。
具体的なGoogleさんとのやり取りをまとめた記事は、こちらにありますので、よろしければご参考にしてください(一部、本記事と内容が重複しますが、ご了承ください)。
本記事では、これからOAuth検証の申請をされる方が、同じ苦労をされないよう、具体的な申請手順と、自分が度重なるリジェクトを通じて得た教訓(スムーズに承認されるポイント)を整理し、共有したいと思います。
また、自分が申請画面の各入力欄の意図(何のためにこの情報を入力しているのか?)を理解するのに苦労したので、初めての方でも分かりやすいよう、できるだけ画面キャプチャを多く掲載し、説明も記載しました。
なお、本記事の対象は、Android・iOSアプリ(ネイティブアプリ)が前提となります。
Webアプリとは対処法が異なる部分が多々あるので、その点はご留意ください。
もともとOAuth検証はWebアプリを前提に作られたプロセスのようなので、Webアプリの方が比較的容易に承認されるかと思います。
一方、ネイティブアプリを対象にした情報(記事)はネット上で見つからず、手探り状態だったので、かなり苦労しました。。
※アプリ開発をしているはずなのに、なぜかYouTube動画を作ったり、ウェブページ内の一部ページのファビコンを変更したりと、色々と鍛えられました(^^;
40代からプログラミング(Flutter)を始めて、GooglePlayとAppStoreにアプリを公開しているhalzo appdevです。
作成したアプリはこちら↓ 全てFlutterで開発したアプリです。
どういう場合に承認を得る必要があるのか
Google APIでユーザーデータにアクセスするには、ユーザーの同意を得るポップアップ(以下、「同意画面」)を表示する必要があります。
※下記は、先日リリースしたアプリ「かんたんプリント管理」の同意画面の例です。
使用するGoogle APIが、「機密性の高いスコープ(※1)」に該当している場合、同意画面の表示に加え、Googleから問題ないアプリかどうかを検証してもらい、承認(OAuth(※2)検証の承認)を得る必要があります。
(※1) ユーザーにデータへのアクセス許可を求める権限範囲
(※2) ユーザーデータにアクセスする際の認証方式
承認無しでも使用はできますが、Google APIにアクセスする際、ユーザーに以下のようなアラート画面が表示されてしまいます。
左下の「詳細」をクリックして進めば利用できますが、サービスとしてユーザーに与える印象は悪いです。また、そもそも非承認の状態だと、利用できるユーザー数も100人までとされています。
そのため、OAuth検証の承認を得ることは不可欠となります。
なお、「機密性の高いスコープ」よりも更に重要度の高い「制限付きスコープ」というのもあります。
「制限付きスコープ」を使用する場合は、Googleからの承認だけでなく、セキュリティ評価機関による評価も必要となり、「10,000ドル〜75,000ドル(またはそれ以上)※小規模アプリなら4,500ドル」の費用がかかると説明されています。
そのため、できるだけ「制限付きスコープ」は使用しない方が良いと思います。
本記事では、Google CalendarとGoogle DriveのAPIを利用し、Google Calendarが機密性の高いスコープ(Googleの承認が必要)、Google Driveは非機密のスコープ(Googleの承認は不要)を利用する前提で、話を進めます。
OAuth検証の審査申請手順
Google Cloud Platform(GCP)のプロジェクト作成
Google APIを利用するには、GCP上にプロジェクトを作成する必要がありますが、Firebaseでプロジェクトを作成すると、GCPのプロジェクトも自動生成されます。
Google APIを利用する場合、サインイン機能などを実装するため、Firebaseを使用することが一般的かと思います。
そのため、本記事でも、Firebaseプロジェクトの作成を通じて、GCPのプロジェクトを自動生成する事を前提としました。
Firebaseでのプロジェクト作成 → GCPのプロジェクト自動生成 の方法は、下記記事に詳細を整理したので、こちらをご参照ください。
※Futterのバージョン2.5.3以下を対象とした内容になります。
※2021/12/9にリリースされたFlutter2.8以降を対象とした方法は、下記のFlutter公式ページをご参照ください。
以下では、既にGCPのプロジェクトが作成されており、認証情報ページが下図のように設定されている前提で話を進めていきます。
Android・iOSアプリを前提としているため、それぞれのAPIキー、OAuth2.0クライアントIDが作成されています。 ※Webアプリ用の「Browser key」、「Web client」も同時に作成されます。
APIの有効化
まず、左側メニューの「ライブラリ」から下図の手順で「Google Drive API」と「Google Calendar API」を検索し、有効化ボタンを押します。
これで、プロジェクトに対して、2つのAPIが有効化されます。
OAuth同意画面等の設定(アプリ登録の編集)
左側メニューの「APIとサービス」から「OAuth同意画面」を選択し、画面上部の「アプリを編集」をクリックします。
一度「アプリを編集」を終えていると、「確認を準備する」というボタンも出てきますが、初めて同意画面の設定をする場合は、「アプリを編集」のボタンしかないので、ここから初期設定をします。
なお、「公開ステータス」が「本番環境」であることを確認してください。※テストになっていた場合の戻し方は後述します。
また、「ユーザーの種類」は、一般のGoogleユーザーを対象とするため、「外部」になります。
「アプリを編集」に入ると、右側に同意画面のイメージが表示され、アプリ情報を入力する画面になります。
後になって理解したのですが、ここからの一連の画面に情報を入力することで、後述するGoogleへの審査申請用の画面に、同じ情報が自動的に反映されるので、申請前の事前準備的な位置づけになっているようです。
また、後述する「機密性の高いスコープ」を使用している場合には、ここでの設定により、審査承認前でも、アプリからGoogle APIにアクセスする際に、同意画面を表示できるようになります(前述のような警告画面が出た後になりますが)。
※一方、設定をせずに、アプリからGoogle APIにアクセスしようとすると、延々とサインイン画面が起動せず、先に進めなくなってしまいます。
まずは、下図のとおり、同意画面に表示するアプリ名、ユーザーサポート用のメールアドレス(公開して良いもの)、アプリアイコンを登録します。
画面の下の方へ行き、アプリを紹介するホームページ、プライバシーポリシー、利用規約のURLを入力します。
これらは作成必須のため、事前にご自身でドメインを取得するなどして、各ページを用意しておきます。
ここで、自分が審査で却下された経験から、3点ほど注意点があります。
次に、承認済みドメインの欄に、上で登録したアプリの紹介ページ等のドメインを登録します。
デフォルトでは、Firebaseでの設定時に自動登録されたドメインが入っています。
Webアプリの際に必要となるドメインですが、この所有権の確認手続きをするには、Firebase Hosting上にWebページを作る必要があります。
リリースするのがネイティブアプリのみである場合は、このドメインは不要なので、下図のように削除しておきます。
※所有権の確認手続きがなされないまま登録しておくと、審査時に却下されてしまいます。
最後に、Googleとの連絡用メールアドレスを入力したら、「保存して次へ」を押します。
次の画面では、スコープ(ユーザーにデータへのアクセス許可を求める権限範囲)を選択します。
下記のような画面が表示されるので、使用したいスコープをチェックします。
ここでは、例として、Google Calendarに読み書きができるスコープと、Google Drive内にアプリ専用フォルダを作ってファイルの読み書きができるスコープを選択します。
Google Calendarの方には、白い鍵マークがついており、「機密性の高いスコープ」であることを示しています。
「機密性の高いスコープ」を選択すると、下図のようなポップアップが出て、同意画面の表示だけでなく、事前にGoogleからのOAuth検証の承認を得る必要があるとの説明が表示されます。
なお、「制限付きのスコープ」は、下図のように黒い鍵マークで表示されています。
前述のとおり、「制限付きのスコープ」を使用すると、Googleの審査に加え、セキュリティ評価に高額の費用がかかるため、できれば使用しない方が良いと思います。
スコープの選択が終わると、下図のような画面になるので、「スコープの使用方法」を記入して、次へ進みます。
※使用方法については、説明不足だとGoogleの審査時に却下される可能性があるので、使用する理由などをきちんと記入したほうが良いです。
画面最下部のYouTubeのリンクは、この時点ではまだ動画作成できていないと思うので、入力しなくて大丈夫です。
最後の「省略可能な情報」は、基本的には記入不要です。
ただ、自分の場合は何度もリジェクトされたこともあり、中段の詳細情報の欄に、APIのアプリ内での利用場面や利用目的の説明を記入しました。
また、
ネイティブアプリのため、本番リリース”前”にOAuth検証の審査を受けたい(リリース後の審査では困る)
という点も、記載しておくと良いと思います。
恐らく、OAuth検証がWebアプリを想定したプロセスとなっていることが原因だと思うのですが、自分が審査に出した際、
あなたのサービスは、まだリリースされていないので、審査できない
と何度も却下されてしまいました。
ネイティブアプリは、Webアプリとは異なり、正常動作しない状態でリリースすると、ユーザーに与える印象が悪く、低評価なども付く可能性があるので避けたいと考えるのが普通です(そもそも、アプリの掲載審査で却下される可能性もあります)。
そのため、審査前にあらかじめその点を強く主張し、Googleに理解いただく必要があります(結局、自分はメールで何度も伝えてようやく理解してもらえました。。。)。
以上で「保存して次へ」をクリックします。
これまでの入力結果の確認画面が出ます。
修正したい場合は、「編集」ボタンか、上部の各パートのボタンから戻って再編集できます。
これで「アプリ登録の編集」の設定は終わりです。
画面下部の「検証を準備する」を押すと、そのまま検証審査に出すための画面に入れますが、その前に準備することがあるため、いったんGCPでの操作は終了します。
同意画面の表示プロセスを撮影したYouTube動画(デモビデオ)の作成
同意画面を設定したことにより、アプリ上で、APIを使用するためにGoogleアカウントでサインインすると、冒頭で掲載したアラート画面を通過した後、下図のようなOAuth認証の同意画面が表示されるようになります。
※本記事では、具体的な実装(コード)に関する説明は割愛します。以降では、既にGoogle APIやGoogle SignInの実装は済んでいる事を前提に、話を進めます。
アプリ内で、この同意画面を表示させ、ユーザーが同意する流れを動画撮影し、デモビデオとしてYouTubeにアップします。
動画撮影は、Androidのエミュレーターを使うと、下図のように簡単に撮影できます。
デフォルトの動画形式「WEBM」が、YouTubeにも対応しているため、そのままアップロードできて便利です。
以下に、自分が何度も却下された経験を踏まえ、デモビデオ作成時の注意点を記載しておきます。
ご参考までに、自分が審査で承認されたときのデモ動画を下記に掲載しておきます(結構大変でした。。)。
OAuth検証審査への申請提出
YouTubeデモビデオの準備ができたら、GCPの同意画面の設定に戻ります。
一度、「アプリを編集」から同意画面の設定をすると、同意画面設定のトップページに、下記のとおり「確認を準備する」というボタンが表示されるので、ここから検証審査の申請画面に入ります。
同意画面設定の最初のページと似ていますが、一番上に「検証の準備」と表示されていますので、これはあくまでGoogleに審査に出すための申請ページになります。
最後のステップの名称も「最終レビュー」となっています。
また、画面最上部には、同意画面の設定時に、機密性の高いスコープを選択したため、「Googleによる検証が必要です」と書かれています。
最初のページは、同意画面の設定ページで入力済のはずなので、内容に問題なければ、一番下の「保存して次へ」で進みます(修正したい場合は、その場で修正できます)。
なお、登録したアプリの紹介ページやプライバシーポリシーページのドメインが、「承認済みドメイン」の欄に登録されていないと、下図のようにエラーになって先に進めないので、ご注意ください。
次はスコープ選択の画面です。
これも最初の同意画面設定時に選択したスコープが登録済になっています。
ここで「スコープを追加または削除」のボタンで修正することもできます。
確認して問題なければ、画面下部の「デモ動画」の欄に、上記で作成したYouTube動画のURLを登録します。
次の画面は「省略可能な情報」なので、記入不要で次へ進みます。
ただし、前述のとおり、APIの詳細な利用目的などを記入したほうが、審査にプラスに働くかもしれません。
最後に最終確認の画面になります。ほぼ同じ画面をもう1週見た感じですね。。
問題なければ、最下部の「確認のため送信」を押します。これでようやくGoogleの審査開始になります。
審査開始後
残念ながらリジェクトされてしまうと、下図のようなアイコンの付いたメールが返ってきます。
自分はこのメールを6回いただきました(涙)。
めでたく承認されると、下図のようなアイコンのメールが来ます。
実際に自分がGoogleさんとやり取りした経緯は、こちらの記事で紹介していますので、よろしければご参考にしてください(一部、本記事と内容が重複しますが、ご了承ください)。
補足:テストモードにする方法と、本番環境への戻し方
同意画面の設定ページの「公開ステータス」で、「テストへ戻る」を押すと、テストモードに変更できます。
テストモードでは、GoogleのOAuth検証審査が完了していなくても、リリース時の状態でGoogle APIへのアクセスをテストすることができます。
本番環境に戻したいときは、「アプリを公開」をクリックすると戻せます。
アクセスできるのは、事前に登録したテストユーザーのGoogle アカウントのみになります。
テストユーザーは、下図の方法で、100人まで登録することができます。
実装段階ではテストモードで挙動を確認しながら開発を進め、アプリが完成した段階で、Googleへの申請前に本番環境に変更する、というのがスムーズかもしれません。
まとめ
最後に、自分が経験した注意点を整理しておきます。
- ネイティブアプリのため、本番リリース「前」にOAuth検証の認証を受けざるを得ないことをしっかり主張する。
- 「承認済ドメイン」に、所有権を確認できず、かつ使わないドメインが登録されていたら削除する(Firebase経由でプロジェクトを作った場合に自動設定される「xxxx.firebaseapp.com」など)。
- Google Cloud Platform(GCP)に登録するアプリのアイコン画像と、アプリを紹介するホームページのファビコン画像を一致させる。
- YouTubeのデモビデオでは、同意画面上の各スコープの「Learn more」をクリックし、詳細画面のポップアップ表示をしっかり見せる。
- デモビデオでは、同意画面の言語設定で「English(United States)」を選択する様子をしっかり見せる(初めからOSを英語設定にしていたとしても)。
- ネイティブアプリのため、同意画面上にClient IDを示す必要はない点を主張する(Googleが掲示する例外規定が適用されるため)。
- アプリ紹介のページ内に、プライバシーポリシーへのリンクを設置する。
- プライバシーポリシー内に、Google APIへのアクセスによるユーザーデータの使用目的を明記する。
最後までお読みいただき、ありがとうございました。
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/
コメント