LoginSignup
0
0

あるリクエストがGoogle Chatから送られてきたかどうかを検証する

Posted at

リクエストが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 を返します。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0