web-dev-qa-db-ja.com

Sheets API認証情報を使用してプログラムを配布する

Google Sheets APIを使用してスプレッドシートを読み取り、データを操作するプログラムを作成しようとしています。

私のプログラムには Javaクイックスタート ページから取得したcredentials.jsonファイルが含まれています( Google Developers Console からも取得できます)。それなしではSheets APIを使用できません。

プログラムを数人の消費者に配布したい。ただし、このcredentials.jsonファイルを含むプログラムを配布するリスクがどの程度かはわかりません。

だれでも彼が問題について私を啓発できると思いますか?より安全な代替案はありますか?

編集:

現在の答えを見ると、正しいアプローチはOAuth 2.0です。ただし、 Authorize Requests ページと sing OAuth 2.0 for Java for Google API Client Library for Java ページ、認証プロセスを完了する前に、アプリケーションのIDを含める必要があるようです。唯一知っているIDはAPIです。キーとクライアントIDとクライアントシークレットのペア。

経験則として、私は「秘密」という言葉が含まれているものを配布するべきではないことを知っています。そうは言っても、Stackexchangeなど、アカウントへのアクセスを承認できる他のアプリケーションを見たことがありますが、それらはすべて自分自身を識別できます Google Sign In 。これらのアプリケーション/サイトがセキュリティリスクを示すことなくGoogleに身元を証明できれば、私も同じことができると確信しています。

1つの問題のみ...アプリケーションをどのように特定すればよいですか?

私はGoogle GDEクラウドプラットフォームです。セキュリティが専門です。

言及するcredentials.jsonファイルには、クライアントIDとクライアントシークレットが含まれています。この認証情報ファイルを使用すると、攻撃者はGoogle Gmail/Gsuite/Identityのメールアドレスの認証情報を作成できます。これにより、これらのシークレットにアクセスできるユーザーは、必要な「スコープ」を使用して認証情報を作成し、スプレッドシートやドライブなどのデータにアクセス/読み取り/書き込み/削除できます。ハッカーは、トロイの木馬ソフトウェアをホストしたり、アカウントからポルノを配布したりできます。したがって、このファイルを使用してアプリケーションを配布することは非常に悪い考えです。

正しい方法は、OAuth 2.0をパブリックWebサーバーに実装し、ユーザーにアクセストークンを返します。その後、ユーザーはこのアクセストークンをHTTP Authorizationヘッダーに含めます。Googleスプレッドシートがこのトークンを確認します。これは難しいことではなく、インターネット上には多くの例があり、Auth0などの無料またはほとんど無料のサービスもあり、これを行うことができます。

[質問の更新後に更新]

物事を行うには2つの方法があります。簡単な方法と安全な方法。安全な方法について説明します。

いかなる形式のプライベートシークレットもクライアントに提供しないでください。クライアントIDは公開シークレットと見なされるため、クライアントに提供しても問題ありません。クライアントシークレットは保護する必要があります。

以下は、しばしば三脚OAuthと呼ばれます。

これは、OAuthがWebサーバー(またはサードパーティのサービス)に実装されていることを意味します。クライアントはシークレットを見ることはありません。クライアントはWebサイトのページに移動し、サイトはユーザーをGoogle、Googleは認証を実行し、トークン情報(アクセストークン、IDトークン、更新トークン)を使用してWebサーバー上のURLにコールバックします。

OAuthこのように実装する理由は?GoogleスプレッドシートではOAuthトークンにOAuthスコープが必要であり、クライアントプログラム/ブラウザがスコープを指定することを許可したい。スコープは権限です。クライアントが持つことができる権限を制御する必要があります。

Three-legged OAuth=の反対はTwo-Legged OAuthです。これはブラウザーで発生し、要件に対して安全ではありません。

[two-legged OAuthの更新]

質問で指定されていない項目の1つは、「誰の」データにアクセスするかです。アプリがユーザーのプライベートデータにアクセスしている場合、ユーザーはアプリにユーザーのデータにアクセスする許可を与えています。アプリがプライベートデータにアクセスしている場合は、ユーザーにデータへのアクセス許可を付与しています。

ユースケースがユーザーのデータにアクセスしている場合は、two-legged OAuthで問題ありません(three-leggedが最善の方法です)。この方法は、ブラウザーで完全に実装できます。ただし、すべてのOAuthメソッド、Googleは顧客が参照するために確認済みのドメイン名とウェブサイトを持っていることを要求します。これは再び三脚のOAuthを正しいものにします選択。

3
John Hanley

他の人が述べたように、credentials.jsonファイルは、アカウントへのアクセスを提供します。それはあなたが人々と共有したいものではありません。ただし、次の2つの点を明確にする必要があります。

プログラムで公開することは、共有することと同じです

プログラムに含めることを共有することと同じであることを声に出して言っておく価値があります。確かに、平均的なユーザーはアプリからアプリを引き出すことはできませんが、資格情報を取得するためにアプリをリバースエンジニアリングすることは、可能なことだけではなく、絶対に起こることです。アプリに他の人と共有したくないものは入れないでください。これを他の世界と共有したくない。確かに、誰かがアプリをリバースエンジニアリングして資格情報を盗むまでには長い時間がかかるかもしれませんが、取るに値するリスクではありません。特に理由:

プログラムに資格情報を含めても、他のユーザーには機能しません

プログラムに資格情報を含めることで、自分のアカウントでのみ機能するプログラムを作成できます。明らかにそれはあなたがやろうとしていることではありません。あなたがあなたのプログラムを共有する人々は、おそらくあなたのプログラムではなく、彼らのデータを扱うためにそれを使いたいと思っています。したがって、プログラムで資格情報を公開することに伴うセキュリティの問題を無視しても、単にプログラムで資格情報を配布するだけの場合は、はるかに実用的なユーザーフローの問題があります。要するに、これはとにかく共有プログラムの間違った認証方法です。

ソリューション

幸い、答えは簡単です。OAuth2はGoogleがサポートしています(最近では、ほとんどすべてのクラウドサービスプロバイダーで非常に一般的です)。 OAuth "protocol"は、この特定のユースケース用に設計されました。これは、サードパーティのアプリ(作成したもの)が別のユーザーのアカウントへの制限付きアクセスを取得してアクションを実行できるようにすることを目的としています実際にユーザーに資格情報を要求する必要のないユーザーのために、非常に様式化された(そして単純化された)フローは次のようになります。

  1. ユーザーがアプリを開き、「ログイン」ボタンを押します。
  2. アプリは、誰かのアカウントにアクセスすることをGoogleに通知し、ユーザーをOAuth Googleがホストするログインフローに送信します
  3. ユーザーが自分のGoogleアカウントでGoogleのサービスにサインインする
  4. その後、GoogleはそれらをすべてのAPI呼び出しで使用できる一時アクセストークンと共にアプリにリダイレクトします。
  5. また、最大有効期間とユーザーがログインしている時間によっては、アクセストークンの更新が必要になる場合があります。

OAuthを使用し、認証情報ファイルを使用しないプログラムのバージョンは、必要な誰とでも安全に共有できます。その後、自分でアプリを使用するときに、他のユーザーと同じ方法でログインします。 。もちろん、必要に応じて、組み込みの資格情報を使用してアプリの元のバージョンを保持することもできます。これにより、ログインしなくてもプログラムを使用できるようになります。ただし、そうする場合は、誤って行わないようにしてください。それはあなたの資格情報が含まれているので、それを誰とでも共有してください。

2
Conor Mancone

認証情報のjsonファイルは、サービスアカウントへのフルアクセストークンです。このトークンを使用して、gcpアカウントのあらゆるものにアクセスできます。このユーザーを、Googleのiamを介してアカウントを操作するために必要な最小限に制限すると仮定すると、安全です。さらに、このユーザーを他のすべてのGoogleプロジェクトまたは許可グループの外に置くことを強くお勧めします。

0
Jonathan Allon