2017-01-26 4 views
3

Google App Engineには2つのモジュール(AB)で構成されるアプリケーションがあります。 Aはユーザーの要求を処理し、認証なしで利用できます。 Bは、Aが必要なときに特定のタスクを実行するマイクロサービスです。だから我々はurlfetch使用BからA作るの要求を持っている:内部App Engineモジュール間でリクエストを認証するにはどうすればよいですか?

from google.appengine.api import urlfetch 
from google.appengine.api import app_identity 
rpc = urlfetch.create_rpc() 
urlfetch.make_fetch_call(
    rpc, 
    "https://b-dot-my-project.appspot.com/some/url", 
    method='GET', 
    follow_redirects=False, 
    headers = { 
     'X-Appengine-Inbound-Appid': 'my-project', 
    }, 
) 
response = rpc.get_result() 

Bapp.yamlのようなものになります。docs

runtime: python27 
api_version: 1 
threadsafe: yes 
service: b 

handlers: 
- url: /.* 
    script: my_module.app 
    login: admin 
    auth_fail_action: unauthorized 

を、彼らはお勧め:

が要求を発行する場合別のApp Engineアプリに、App Engineアプリ がそのIDをアサートする必要がありますyヘッダに X-Appengine-Inbound-Appidを追加してリクエストに追加します。 フェッチサービスがリダイレクトに従わないようにする場合、App Engineはこのヘッダ をリクエストに自動的に追加します。

私が何をしても、私はこの要求をするときに401を得続けます。 ABの両方が同じプロジェクトにデプロイされています。 Bのログに要求ヘッダーとエラーが含まれていないため、のログに手動でという設定を試してみました(ただし、hereの理由で動作するとは思われませんでしたが)。条件は、ハンドラモジュールが実行される前に発生します。

私はむしろ、可能な場合Bへというだけでオプションlogin: adminを落とすよりも、認証Aに頼るようになり、ヘッダにのみ依存している、ためにデバッグ目的(プロジェクト管理者アカウントからBを呼び出すことができるように進歩して例)。

+0

同じアプリ内の個別のモジュールは、「...別のApp Engineアプリ、...」ではありません。ヘッダーを変更せずに、アプリケーション内のURLへのurlfetchを実行するだけで済みます。 – GAEfan

+0

そして、 'service:b'の代わりに' module:b'であってはなりませんか?このシナリオでhttps://cloud.google.com/appengine/docs/python/modules/converting – GAEfan

+2

FWIW私はモジュールAでタスクを作成し、urlfetchを使用する代わりにモジュールBによって処理されるキューにプッシュします。 –

答えて

-1

login:adminの代わりに、'HTTP_USER_AGENT': 'AppEngine-Google; (+http://code.google.com/appengine; appid: s~my-project)'のモジュールBリクエストのヘッダーを確認できます。それは、それがurlfetch、taskqueue、またはcronの仕事から来たことを伝えます。

+0

第三者がUser-Agentヘッダーを偽造できることは間違いありませんが、 'X-Appengine-Inbound-Appid'代わりに:https://cloud.google.com/appengine/docs/python/outbound-requests#request_headers また、質問に記載されているように、 'login:admin'を削除すると、' B 'に直接リクエストを行うことができなくなります、私がむしろ持っている機能 – Xocoatzin

+0

第三者は「X-Appengine-Inbound-Appid」ヘッダーも偽造することができます。 – GAEfan

+0

さて、ヘッダーはApp Engineによって設定されており、変更することはできません。ドキュメントの[こちら](https://cloud.google.com/appengine/docs/python/appidentity/#asserting_identity_to_other_app_engine_apps)に記載されています。 [here](https://cloud.google.com/appengine/docs/python/outbound-requests#request_headers) – Xocoatzin

関連する問題