introduction
GAE est pratique, n'est-ce pas?
Il est facile à déployer et à publier.
Vous pouvez également gérer les versions de déploiement d'applications, la gestion du trafic et les tests AB.
En créant plusieurs services
dans GAE dans un projet GCP, il est possible de définir l'environnement comme un micro-service.
Cette fois, nous parlerons d'authentification entre les services GAE qui couvrent plusieurs services.
Ce que je voulais faire
--De plusieurs services GAE, le service A est une application Web ouverte, le service B est une API fermée et le service B n'est accessible qu'à partir du service A.
- Pour des raisons de sécurité, le service B veut être accessible uniquement à partir du service A.
- Si possible, je voudrais m'authentifier avec une couche supérieure (GCP) au lieu de l'authentification dans l'application.
Comment as-tu fais
Est-il possible de s'authentifier avec le compte de service défini par défaut dans GAE?
--Lorsque vous déployez au moins un service sur GAE, un compte de service appelé «[ID-PROJET] @ appspot.gserviceaccount.com» est automatiquement créé.
«Je pensais que ce serait plus facile si je pouvais m'authentifier à l'aide de ce compte, alors je l'ai recherché.
Pourquoi ne pas utiliser Identity-Aware Proxy (IAP)?
――Lorsque j'ai fait des recherches sur diverses choses, j'ai trouvé que la fonction Identity-Aware Proxy (IAP) la rendait supérieure à l'application GAE. Fournira une étape d'authentification.
―― Essayons-le tout de suite!
--Lorsque IAP est activé, le service A et le service B sont appliqués et l'ensemble du GAE est fermé ...
Ce que je veux faire, c'est ouvrir le service A au public et restreindre l'accès au service B uniquement avec IAP.
- Que devrais-je faire.
――Peut-être pouvez-vous contrôler l'autorité pour chaque service?
- Si les autorisations sont attribuées service par service, vous ne devriez pouvoir publier qu'un seul service.

- l'a fait!
- Avec ce paramètre, il y a un léger décalage jusqu'à ce que la réflexion soit terminée, mais lors de l'accès au service A, la redirection d'authentification n'est pas effectuée et seul le service B peut être maintenu privé en toute sécurité.
L'accès à partir d'un navigateur Web est redirigé vers l'écran d'authentification de Google, mais comment vous authentifiez-vous lorsque vous accédez à l'API côté serveur?
――Maintenant, vous avez défini le GCP autour des restrictions d'accès, mais la prochaine fois, vous devez vous authentifier lorsque vous accédez à l'API du service B du service A.
――Si vous faites une demande normalement dans cet état, l'authentification échouera avec une erreur 403.
――C'est là que le compte de service GAE entre en jeu.
- Enregistrez le compte de service en tant qu'utilisateur authentifié du service B.

- Maintenant, l'utilisation de ce compte de service vous donnera accès au service B.
Acquisition de Token côté programme
- Depuis que vous avez défini l'autorité d'accès sur GCP, envoyons la requête HTTP.
- Lors de l'envoi d'une requête HTTP, vous pouvez vous authentifier avec le compte de service en ajoutant un jeton OICD à la demande du compte de service GAE.
-Reportez-vous à cette page et effectuez le traitement suivant.
- Bien qu'il soit écrit en Python ici, il existe des exemples dans d'autres langues dans Documents officiels, donc je pense qu'il n'y a pas de problème. ..
import requests
from google.auth.transport.requests import Request
from google.oauth2 import id_token
IAP_CLIENT_ID = "ID client obtenu à partir de la page d'informations d'identification IAP"
def make_open_id_connect_token(client_id=""):
if not client_id:
client_id = IAP_CLIENT_ID
open_id_connect_token = id_token.fetch_id_token(Request(), client_id)
return open_id_connect_token
token = make_open_id_connect_token()
headers = {
"Authorization": f"Bearer {token}",
}
res = requests.get(url="https://Service B/api/", headers=headers)
print(res.content)
- Vous pouvez être authentifié en obtenant le jeton OICD avec
make_open_id_connect_token ()
et en l'incluant dans l'en-tête de la requête pour y accéder.
à la fin
―― Vous pouvez désormais communiquer entre les services Web publics et les API fermées entre les services GAE avec authentification, ce que vous vouliez à l'origine faire.
«Cependant, les inconvénients sont les suivants.
- S'il y a des services qui sont déjà publiés et exploités, un temps d'arrêt se produira car l'authentification IAP sera temporairement ajoutée à tous les services lorsque IAP est activé.
- Même si vous définissez allUsers pour que tous les utilisateurs puissent accéder via IAP, je pense qu'il y a (probablement) une sorte d'étape d'authentification, donc je pense que c'est mineur, mais cela semble affecter la réponse, etc.
- Chaque fois que vous ajoutez un nouveau service public au projet avec GAE, vous devez ajouter les autorisations allUsers.
«Je pense qu'il est préférable de les utiliser correctement compte tenu de ces inconvénients.
Articles que j'ai utilisés comme référence