通过Python(GoogleAPI服务创建)完成Oauth2.0授权refresh token

Accomplishing Oauth2.0 authorization with refresh token through Python (Google API service creation)

我正在尝试使用 Oauth2 通过无头 Linux 服务器访问 Google API 服务。我通读了关于这个 post 的所有答案:How do I authorise an app (web or installed) without user intervention? but none of them showed how to use the refresh token to generate an access token in python. pinnoyyid had a javascript example () 是这样的:

function get_access_token_using_saved_refresh_token() {
// from the oauth playgroundfunction get_access_token_using_saved_refresh_token() {
// from the oauth playground
const refresh_token = "1/0PvMAoF9GaJFqbNsLZQg-f9NXEljQclmRP4Gwfdo_0";
// from the API console
const client_id = "559798723558-amtjh114mvtpiqis80lkl3kdo4gfm5k.apps.googleusercontent.com";
// from the API console
const client_secret = "WnGC6KJ91H40mg6H9r1eF9L";
// from https://developers.google.com/identity/protocols/OAuth2WebServer#offline
const refresh_url = "https://www.googleapis.com/oauth2/v4/token";
let refresh_request = {
    body:`grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}& refresh_token=${encodeURIComponent(refresh_token)}`;,
    method: "POST",
    headers: new Headers({
        'Content-Type': 'application/x-www-form-urlencoded'
    })
}

JavaScript 并不是我最擅长的语言,但我可以破译他们正在向 google 服务器发送 POST 请求。所以我尝试使用 requests 包在 Python 中重新创建请求:

   import requests
   result = requests.post("https://www.googleapis.com/oauth2/v4/token", body={'grant_type':'refresh-token', 'client_id':client_id, 'client_secret':client_secret, 'refresh_token': refresh_token}, headers={'Content-Type': 'application/x-www-form-urlencoded'})
   

当我查看结果时,它显示它有一个 200 状态代码(成功),但是当我尝试检查响应时,没有什么容易阅读的,我无法在 JSON 中解析结果获取访问令牌。我尝试的另一种方法是使用 Google 的建议代码启动 Flask 服务器:https://developers.google.com/identity/protocols/oauth2/web-server#python_5 但这也不起作用,因为当我尝试 return 来自其中一个的凭据时无论如何都不会 return JSON 的函数(包含访问代码的对象)。我更喜欢 post 请求方法,因为它更简洁并且使用的代码更少。谢谢!

在 Python 中,一种方法是使用 requests-oauthlib 来执行后端应用程序流程。当您没有前端可以将某人重定向到以批准获取令牌时,这很有用。

这个网站 (https://community.atlassian.com/t5/Bitbucket-questions/Refresh-Tokens-using-Python-requests/qaq-p/1213162) 说解决方案可能是这样的:

   import requests
    auth = ("<consumer_id>", "<consumer_secret>")
    
    params = {
      "grant_type":"refresh_token",
      "refresh_token":"<your_refresh_token_here>"
    }
    
    url = "https://www.googleapis.com/oauth2/v4/token"
    
    ret = requests.post(url, auth=auth, data=params) #note data=params, not params=params

由于上述 none 解决方案有效,我最终不得不放弃并使用服务帐户。