【问题标题】:Implementing OAuth on Dropbox API Python在 Dropbox API Python 上实现 OAuth
【发布时间】:2019-10-16 07:02:09
【问题描述】:

我正在尝试将用户添加到我的 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))

但我收到错误b'Error in call to API function "auth/token/from_oauth1": Invalid value in HTTP header "Authorization": "Basic &lt;APP_KEY&gt;:&lt;APP_SECRET&gt;"'

APP_KEYAPP_SECRET 显然被替换为它们对应的字符串。

我打电话给/token/from_oauth1而不是/oauth2/token对吗?如果是这样,我的这个请求哪里出错了?

【问题讨论】:

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


    【解决方案1】:

    如果您要开始与 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,因为它会为您完成大部分工作。它具有处理 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)
    

    【讨论】:

    • 感谢 Greg 的澄清,很高兴知道我应该使用 OAuth2。此时我已经通读了 OAuth2 文档,它仍然有点超出我的能力,并且似乎没有任何示例说明如何使用 requests 模块在 Python 中实现它。我想我真的只是在寻找与 Requests 一起使用的示例代码来理解它。
    • @Matt 我已经编辑了我的答案以包含一个处理流程的基本示例。我希望这会有所帮助。 (不过,我确实建议在实际构建时使用官方 SDK。)
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多