如何在 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 使用