在Dropbox API Python上实现OAuth

时间:2019-05-30 15:38:01

标签: python oauth oauth-2.0 python-requests dropbox-api

我正在尝试将用户添加到我的保管箱应用程序的开发用户中。为此,似乎我必须连接到端点/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))

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

1 个答案:

答案 0 :(得分:1)

如果要开始与Dropbox API的新集成,则不应使用/2/auth/token/from_oauth1。这仅适用于现有的OAuth 1访问令牌,您只能从与Dropbox API v1的旧集成中收到的令牌(现已淘汰)。

如果您现在就开始,那么您将仅使用Dropbox API v2和OAuth 2访问令牌。

要实现the OAuth app authorization flow以获取OAuth 2访问令牌以与Dropbox API v2一起使用,您应使用以下代码:

我还建议您查看the OAuth Guide

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

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

这是仅使用requests处理Dropbox OAuth 2“代码”流的最小示例:

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)