[PYTHON] Authentifiez les services GAE avec IAP et effectuez une communication HTTP dans le même projet GCP

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.

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! image.png --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.

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.

Acquisition de Token côté programme

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)

à 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.

Articles que j'ai utilisés comme référence

Recommended Posts

Authentifiez les services GAE avec IAP et effectuez une communication HTTP dans le même projet GCP