在 Dropbox 上实施 OAuth API Python
Implementing OAuth on Dropbox API Python
我正在尝试将用户添加到我的保管箱应用程序的开发用户中。为此,我似乎必须连接到端点 /token/from_oauth1
or/and /oauth2/token
以生成它们的访问令牌。我刚开始使用 API,并且努力了解如何在我的代码中实现 OAuth/OAuth2。我正在使用 requests
库。
这是我尝试过但没有奏效的示例:
import requests
import json
url = "https://api.dropboxapi.com/2/auth/token/from_oauth1"
headers = {
"Authorization": "Basic <APP_KEY>:<APP_SECRET>",
"Content-Type": "application/json"
}
data = {
"oauth1_token": "<DROPBOX_USERNAME>",
"oauth1_token_secret": "<DROPBOX_PASSWORD>"
}
r = requests.post(url, headers=headers, data=json.dumps(data))
但我收到错误 b'Error in call to API function "auth/token/from_oauth1": Invalid value in HTTP header "Authorization": "Basic <APP_KEY>:<APP_SECRET>"'
APP_KEY
和 APP_SECRET
显然被替换为相应的字符串。
我打电话给 /token/from_oauth1
而不是 /oauth2/token
对吗?如果是这样,这个请求哪里出错了?
如果您开始与 Dropbox API 进行新的集成,则不应使用 /2/auth/token/from_oauth1。这仅适用于现有的 OAuth 1 访问令牌,您只能从与 Dropbox API v1 的旧集成中获得,该版本现已停用。
如果您现在开始,您将只使用带有 OAuth 2 访问令牌的 Dropbox API v2。
要实现 the OAuth app authorization flow 以获取用于 Dropbox API v2 的 OAuth 2 访问令牌,您应该使用以下内容:
- https://www.dropbox.com/oauth2/authorize (documented here)
- https://api.dropboxapi.com/oauth2/token (documented here)
我还建议查看 the OAuth Guide。
在任何情况下,您都不应直接处理 Dropbox 用户名和密码。
此外,由于您使用的是 Python,我强烈建议您使用 the official Dropbox API v2 Python SDK, as it will do most of the work for you. It has helpers for processing the OAuth flow, such as DropboxOAuth2Flow
and DropboxOAuth2FlowNoRedirect
。
这是一个仅使用 requests
:
处理 Dropbox OAuth 2 "code" 流程的最小示例
import requests
app_key = "APP_KEY_HERE"
app_secret = "APP_SECRET_HERE"
# build the authorization URL:
authorization_url = "https://www.dropbox.com/oauth2/authorize?client_id=%s&response_type=code" % app_key
# send the user to the authorization URL:
print 'Go to the following URL and allow access:'
print(authorization_url)
# get the authorization code from the user:
authorization_code = raw_input('Enter the code:\n')
# exchange the authorization code for an access token:
token_url = "https://api.dropboxapi.com/oauth2/token"
params = {
"code": authorization_code,
"grant_type": "authorization_code",
"client_id": app_key,
"client_secret": app_secret
}
r = requests.post(token_url, data=params)
print(r.text)
我正在尝试将用户添加到我的保管箱应用程序的开发用户中。为此,我似乎必须连接到端点 /token/from_oauth1
or/and /oauth2/token
以生成它们的访问令牌。我刚开始使用 API,并且努力了解如何在我的代码中实现 OAuth/OAuth2。我正在使用 requests
库。
这是我尝试过但没有奏效的示例:
import requests
import json
url = "https://api.dropboxapi.com/2/auth/token/from_oauth1"
headers = {
"Authorization": "Basic <APP_KEY>:<APP_SECRET>",
"Content-Type": "application/json"
}
data = {
"oauth1_token": "<DROPBOX_USERNAME>",
"oauth1_token_secret": "<DROPBOX_PASSWORD>"
}
r = requests.post(url, headers=headers, data=json.dumps(data))
但我收到错误 b'Error in call to API function "auth/token/from_oauth1": Invalid value in HTTP header "Authorization": "Basic <APP_KEY>:<APP_SECRET>"'
APP_KEY
和 APP_SECRET
显然被替换为相应的字符串。
我打电话给 /token/from_oauth1
而不是 /oauth2/token
对吗?如果是这样,这个请求哪里出错了?
如果您开始与 Dropbox API 进行新的集成,则不应使用 /2/auth/token/from_oauth1。这仅适用于现有的 OAuth 1 访问令牌,您只能从与 Dropbox API v1 的旧集成中获得,该版本现已停用。
如果您现在开始,您将只使用带有 OAuth 2 访问令牌的 Dropbox API v2。
要实现 the OAuth app authorization flow 以获取用于 Dropbox API v2 的 OAuth 2 访问令牌,您应该使用以下内容:
- https://www.dropbox.com/oauth2/authorize (documented here)
- https://api.dropboxapi.com/oauth2/token (documented here)
我还建议查看 the OAuth Guide。
在任何情况下,您都不应直接处理 Dropbox 用户名和密码。
此外,由于您使用的是 Python,我强烈建议您使用 the official Dropbox API v2 Python SDK, as it will do most of the work for you. It has helpers for processing the OAuth flow, such as DropboxOAuth2Flow
and DropboxOAuth2FlowNoRedirect
。
这是一个仅使用 requests
:
import requests
app_key = "APP_KEY_HERE"
app_secret = "APP_SECRET_HERE"
# build the authorization URL:
authorization_url = "https://www.dropbox.com/oauth2/authorize?client_id=%s&response_type=code" % app_key
# send the user to the authorization URL:
print 'Go to the following URL and allow access:'
print(authorization_url)
# get the authorization code from the user:
authorization_code = raw_input('Enter the code:\n')
# exchange the authorization code for an access token:
token_url = "https://api.dropboxapi.com/oauth2/token"
params = {
"code": authorization_code,
"grant_type": "authorization_code",
"client_id": app_key,
"client_secret": app_secret
}
r = requests.post(token_url, data=params)
print(r.text)