Google App Engineには2つのモジュール(A
とB
)で構成されるアプリケーションがあります。 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()
B
のapp.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
を得続けます。 A
とB
の両方が同じプロジェクトにデプロイされています。 B
のログに要求ヘッダーとエラーが含まれていないため、のログに手動でという設定を試してみました(ただし、hereの理由で動作するとは思われませんでしたが)。条件は、ハンドラモジュールが実行される前に発生します。
私はむしろ、可能な場合B
へというだけでオプションlogin: admin
を落とすよりも、認証A
に頼るようになり、ヘッダにのみ依存している、ためにデバッグ目的(プロジェクト管理者アカウントからB
を呼び出すことができるように進歩して例)。
同じアプリ内の個別のモジュールは、「...別のApp Engineアプリ、...」ではありません。ヘッダーを変更せずに、アプリケーション内のURLへのurlfetchを実行するだけで済みます。 – GAEfan
そして、 'service:b'の代わりに' module:b'であってはなりませんか?このシナリオでhttps://cloud.google.com/appengine/docs/python/modules/converting – GAEfan
FWIW私はモジュールAでタスクを作成し、urlfetchを使用する代わりにモジュールBによって処理されるキューにプッシュします。 –