![](/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.