如何在 Python 中使用 Refresh Token Google API? [复制]

Posted

技术标签:

【中文标题】如何在 Python 中使用 Refresh Token Google API? [复制]【英文标题】:How to use Refresh Token Google API in Python? [duplicate] 【发布时间】:2019-06-16 17:23:53 【问题描述】:

这个功能是从谷歌获得认证服务。之后

        API_SERVICE_NAME = 'youtubereporting'
        API_VERSION = 'v1'
        CLIENT_SECRETS_FILE = "client_secret_929791903032-hpdm8djidqd8o5nqg2gk66efau34ea6q.apps.googleusercontent.com.json"
        SCOPES = ['https://www.googleapis.com/auth/yt-analytics-monetary.readonly']
        def get_authenticated_service():
            flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
            credentials = flow.run_local_server()
            return build(API_SERVICE_NAME, API_VERSION, credentials=credentials)

但我想使用 Refresh Token 自动进行身份验证,而无需打开浏览器。因此在上面的函数中添加一些代码来保存Refresh Token:

def get_authenticated_service():
    flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
    credentials = flow.run_local_server()
    with open('refresh.token', 'w+') as f:
        f.write(credentials._refresh_token)
    print('Refresh Token:', credentials._refresh_token)
    print('Saved Refresh Token to file: refresh.token')
    return build(API_SERVICE_NAME, API_VERSION, credentials=credentials)

好的,那么有了Refresh Token之后,如何使用呢?我试图替换刷新令牌="ABCDEF456",但它不起作用

def get_authenticated_service():
    return build(API_SERVICE_NAME, API_VERSION, credentials="ABCDEF456")

【问题讨论】:

我不明白你说的I tried to replace the refresh token ="ABCDEF456" but it does not work是什么意思 什么是 API_SERVICE_NAME 和 API_VERSION? @JohnHanley 我的意思是在拥有刷新令牌之后?然后我读取刷新令牌文件,然后直接粘贴值(例如:ABCDEF456 我添加了 API_SERVICE_NAME 和 API_VERSION! 可能我直接将刷新令牌粘贴到build 函数的方式是错误的。这就是我问这个问题的原因。如何使用刷新令牌? 【参考方案1】:

要刷新访问令牌,您可以调用 Google OAuth 端点并传入三个参数:

客户 ID 客户端密码 刷新令牌

这可以通过一个简单的 HTTP POST 请求非常简单地完成。

这是一个使用 curl 的示例:

set REFRESH_TOKEN=REPLACE_WITH_REFRESH_TOKEN

curl ^
--data client_id=%CLIENT_ID% ^
--data client_secret=%CLIENT_SECRET% ^
--data grant_type=refresh_token ^
--data refresh_token=%REFRESH_TOKEN% ^
https://www.googleapis.com/oauth2/v4/token

在 Python 中使用 requests 库:

// Call refreshToken which creates a new Access Token
access_token = refreshToken(client_id, client_secret, refresh_token)

// Pass the new Access Token to Credentials() to create new credentials
credentials = google.oauth2.credentials.Credentials(access_token)

// This function creates a new Access Token using the Refresh Token
// and also refreshes the ID Token (see comment below).
def refreshToken(client_id, client_secret, refresh_token):
        params = 
                "grant_type": "refresh_token",
                "client_id": client_id,
                "client_secret": client_secret,
                "refresh_token": refresh_token
        

        authorization_url = "https://www.googleapis.com/oauth2/v4/token"

        r = requests.post(authorization_url, data=params)

        if r.ok:
                return r.json()['access_token']
        else:
                return None

注意:如果在授权请求期间最初请求,此代码还将返回一个刷新的 ID Token。

【讨论】:

如何导入requests 哦,我进口了!但代码什么也没返回 这不起作用并失败,请求缺少有效的 API 密钥 @UlysseMizrahi - API 密钥和 OAuth 令牌是不同类型的授权。创建一个新问题,显示您如何创建令牌和确切的错误消息。 @Analytics POPSWW 您能否解决未打开浏览器以授权访问 GDrive 文件的问题?因为我被困在一个类似的问题上。如果您能分享解决问题的步骤,那就太好了。我有一个 oAuth2 client_secret.json 用于授权和列出驱动器中的文件,然后我使用服务帐户中的 credentials.json 文件来读取内容。但是,我想自动化它而不需要手动授权,并从 AWS EC2 实例运行脚本。

以上是关于如何在 Python 中使用 Refresh Token Google API? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Riverpod 实现 pull-to-refresh

如何在 Python 中使用 Refresh Token Google API? [复制]

Android 使用 Pull to Refresh 实现 SwipeListView

Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

我可以在不使用 ScrollView/ListView 的情况下使用 Pull to Refresh 吗?

商店排序后 Sencha Touch Pull to Refresh 不起作用