リクエストがGoogle Chatから送られてきているのかを検証したい
Google Chatにbotをデプロイする場合、botのエンドポイントを設定する必要があります。HTTPエンドポイントを利用する場合、URLを知っている人は誰でもbotを利用できる可能性があります。なので、リクエストがGoogle Chatから送られてきているかを検証し、不正な利用ができないようにする必要があります。
Bearer Tokenを使って検証を行う
Google Chatからの通知はheaderにBearer Tokenがついているため、このトークンを使って検証を行います。いかに検証を行うサンプルコードを示します。
verify.py
from flask import Request
from google.auth.transport import requests
from google.oauth2 import id_token
# 以下2つは定数なので固定
PUBLIC_CERT_URL_PREFIX = 'https://www.googleapis.com/service_accounts/v1/metadata/x509/'
CHAT_ISSUER = 'chat@system.gserviceaccount.com'
CERT_URL = PUBLIC_CERT_URL_PREFIX + CHAT_ISSUER
# ここを自分のGCPの情報で置き換える
AUDIENCE = 'GoogleChatAPIを有効にしているプロジェクト番号'
def verify_request(request: Request) -> bool:
"""
Bearer tokenを検証して、リクエストがGoogle Chatから送信されていることを確認する。
Args:
request (Request): Flask request object
Returns:
bool: True if the request is valid, False otherwise
"""
auth_header = request.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Bearer '):
return False
bearer_token = auth_header.split(' ')[1]
try:
# Verify valid token, signed by CHAT_ISSUER, intended for a third party.
token = id_token.verify_token(bearer_token, requests.Request(), AUDIENCE, CERT_URL)
if token['iss'] != CHAT_ISSUER:
return False
except BaseException:
return False
return True
このコードではheaderから Authorization
キーを取得し、その中のBearer Tokenを検証しています。検証が成功した場合は True
、失敗した場合は False
を返します。