在 Dropbox API Python 上实现 OAuth

Mat*_*att 1 python oauth oauth-2.0 dropbox-api python-requests

我正在尝试将用户添加到我的 Dropbox 应用的开发用户中。为此,我似乎必须连接到端点/token/from_oauth1或/和/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))
Run Code Online (Sandbox Code Playgroud)

但我收到错误 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. 如果是这样,这个请求我哪里出错了?

Gre*_*reg 5

如果您开始与 Dropbox API 进行新的集成,则不应使用/2/auth/token/from_oauth1。这仅适用于现有的 OAuth 1 访问令牌,您只能从与 Dropbox API v1 的旧集成中获得这些令牌,该集成现已停用。

如果您现在开始,您将只使用带有 OAuth 2 访问令牌的 Dropbox API v2。

要实施OAuth 应用授权流程以获取 OAuth 2 访问令牌以用于 Dropbox API v2,您应该使用以下内容:

我还建议查看OAuth 指南

在任何情况下,您都不应该直接处理 Dropbox 用户名和密码。

此外,由于您使用的是 Python,我强烈建议您使用官方 Dropbox API v2 Python SDK,因为它将为您完成大部分工作。它具有处理 OAuth 流程的帮助程序,例如DropboxOAuth2FlowDropboxOAuth2FlowNoRedirect

这是仅使用以下内容处理 Dropbox OAuth 2“代码”流的最小示例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)
Run Code Online (Sandbox Code Playgroud)