I have an application in Google App Engine that consists in 2 modules (A
and B
). A
handles user requests and it's available without authentication. B
is a microservice that perform certain tasks when A
requires it. So we have A
making requests to B
using urlfetch
:
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
's app.yaml
looks something like:
runtime: python27
api_version: 1
threadsafe: yes
service: b
handlers:
- url: /.*
script: my_module.app
login: admin
auth_fail_action: unauthorized
In the docs, they suggest:
When issuing a request to another App Engine app, your App Engine app must assert its identity by adding the header X-Appengine-Inbound-Appid to the request. If you instruct the URL Fetch service to not follow redirects, App Engine will add this header to requests automatically.
No matter what I do, I keep getting a 401
when making this request. Both A
and B
are deployed in the same project. Tried setting follow_redirects=False
and adding the headers X-Appengine-Inbound-Appid
manually (though I didn't expect it to work for the reasons described here), still not sure if the header is being set, as the logs for B
don't include request headers and the failure condition happens before my handler module gets executed.
I would rather if possible to rely on A
authenticating to B
rather than just dropping the option login: admin
and rely only on the header, as it is nicer to be able to call B
from a project admin account (for debugging purposes for example).
Instead of specifying login: admin
in your config, use the python library instead: https://cloud.google.com/appengine/docs/standard/python/refdocs/google.appengine.api.users This way you can check for the app engine header first, and fallback to the admin google user.
Instead of login:admin
, you could check the header in module B request for 'HTTP_USER_AGENT': 'AppEngine-Google; (+http://code.google.com/appengine; appid: s~my-project)'
. That tells you it came from urlfetch, taskqueue, or cron job.
来源:https://stackoverflow.com/questions/41864284/how-to-authenticate-requests-across-internal-app-engine-modules