在 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_KEYAPP_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 访问令牌,您应该使用以下内容:

我还建议查看 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)