Jak inni zwrócili uwagę, powołując się na nagłówku X-AppEngine-Inbound-AppID jest wypełniony jest najprostszym rozwiązaniem. Ostatnio miałem podobny problem, ale nie mogłem użyć X-Appengine-Inbound-Appid, ponieważ funkcja URLFetch nie była dostępna (GAE Node.js). Oto, jak rozwiązać problem za pomocą kont usług uwierzytelnionych za pośrednictwem protokołu OAuth.
Po stronie nadawcy, czego potrzebujesz skonfigurować konto usługi: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount
Następnie w tej aplikacji będzie trzeba uzyskać poświadczenia konta usługa: https://developers.google.com/identity/protocols/application-default-credentials
Następnie można użyć poświadczeń, aby authClient, którego można użyć do wysłania żądania. Będziesz musiał dodać zakres OAuth do swojego authClient. Najbardziej logiczne do użycia jest https://www.googleapis.com/auth/userinfo.email
. Umożliwi to odbiorcy uzyskanie adresu e-mail konta usługi nadawcy. https://developers.google.com/identity/protocols/googlescopes
Oto kod za to, że pracują w (nadawcę) node.js:
process.env.GOOGLE_APPLICATION_CREDENTIALS = <PATH TO CREDENTIALS FILE>
google.auth.getApplicationDefault((err, authClient) => {
if (err) {
console.log("Failed to get default credentials: ", String(err));
return;
}
if (authClient.createScopedRequired && authClient.createScopedRequired()) {
authClient = authClient.createScoped([
'https://www.googleapis.com/auth/userinfo.email'
]);
}
auth_client.request({
url: <RECEIVER URL>,
method: "GET"
}, (error, result, response) => {
// Process response
});
});
Następnie po stronie odbiornika trzeba zweryfikować adres e-mail zgodny z adresem e-mail z konta usługi nadawcy. Gdy mechanizm aplikacji jest wywoływany lokalnie, żądanie OAuth nie jest poprawnie uwierzytelniane, więc jeśli chcesz przetestować lokalnie, musisz pobrać adres URL, aby samemu zweryfikować żądanie.
Odbiornik Python:
scope = "https://www.googleapis.com/auth/userinfo.email"
allowed_users = set([
"<SENDER SERVICE ACCOUNT EMAIL>"
])
IS_DEV = os.environ["SERVER_SOFTWARE"][:3] == "Dev"
class MyHandler(webapp2.RequestHandler):
def get(self, clientId):
user = self.get_current_user()
if user in allowed_users:
# Do whatever you wanted
def get_current_user(self):
if IS_DEV:
token = self.request.headers.get("Authorization")[len("Bearer "):]
response = urlfetch.fetch(
"https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=%s" % token
)
return json.loads(response.content)["email"]
else:
return oauth.get_current_user(scope)
Czy osoba znająca identyfikatory aplikacji z autoryzowanych aplikacji nie może podszyć się pod nią ręcznie, dodając nagłówek ręcznie? –
Nie. "Ten nagłówek nie może zostać sfałszowany przez inne aplikacje lub usługi zewnętrzne - jest czyszczony przez system App Engine" http://stackoverflow.com/a/7961397/789417 –
Powyższy kod nie będzie działał, jeśli Nagłówek X-Appengine-Inbound-Appid nie występuje. Jeśli nagłówek nie jest obecny, app_id będzie Brak. Sprawdzanie, czy Brak jest w krotce, spowoduje wystąpienie TypeError. To, czego naprawdę potrzebujesz, to AUTHORIZED_APPS, aby być listą. Sprawdzanie, czy brak jest na liście, jest poprawną czynnością w Pythonie. – timbo