繁体   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