簡體   English   中英

在 Python 中驗證 Google API 請求令牌

[英]Authenticate Google API request token in Python

我與 Google Hangouts API 集成的本地托管機器人使用 python 的 Tornado 模塊來接受來自 Google 的用戶輸入並以適當的回復進行響應。 這是機器人服務器上的請求處理程序:

class incomingRequestHandler(tornado.web.RequestHandler):
    def post(self):
        recievedData = json.loads(self.request.body.decode('utf-8'))
        
        responseData = generateResponse(recievedData)
           
        self.write({ 'text' : responseData })

這很好用。 現在我想對傳入的請求進行身份驗證,以確保它們僅來自 Google Hangouts。

來自 Google 的請求的標頭中確實有一個授權不記名令牌,我確定這就是驗證所需的內容。 因此,根據這篇文章,我采取了推薦的措施,例如使用id_token.verify_oauth2_token()或查詢https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123但兩種解決方案似乎都不起作用。

有人能指出我正確的方向嗎? 我是否使用了正確的令牌,或者這是驗證傳入請求的錯誤方法?

這個問題源於我不知道 JWT 是什么,也不知道我遇到的是 JWT。 我猜想自己處理事情的另一個症狀。

無論如何,解決方案只是從這個鏈接獲取谷歌證書,使用 openssl 生成相應的公鑰並將身份驗證令牌中指定的密鑰(由kid值)提供給python 的jwt 模塊jwt.decode()方法。

這是解決方案的一個片段:

selectedKey = certs.get(jwtHeader.get('kid')) //certs is a dict containing the public keys from Google
        
checksum = jwt.decode(token, selectedKey, algorithms=["<value-of-alg>"], audience="<value-of-aud>", issuer="<value-of-iss>") //token is simply the authentication token as a string

請注意以下用於將 Google 的 x509 證書轉換為 pem 格式公鑰的 bash 命令:

openssl x509 -pubkey -noout -in key.pem

我認為 python 還沒有針對上述問題提供非常模塊化的解決方案。 如果有,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM