![](/img/trans.png)
[英]Authenticate all Request to REST API with no username/password to get any token
[英]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.