【问题标题】:How can I get an oauth2 access_token using Python如何使用 Python 获取 oauth2 access_token
【发布时间】:2021-04-10 22:07:05
【问题描述】:

对于一个项目,有人给了我这个我在 Postman 中用于测试目的的数据:

在 Postman 中,这非常有效。

授权网址:https://api.example.com/oauth/access_token
访问令牌 URL:https://api.example.com/access_token
客户 ID:abcde
客户端密码:12345
令牌名称:access_token
授予类型:客户端凭据

我只需要取回访问令牌。

一旦获得访问令牌,我就可以继续。

我已经尝试了几个 Python 包和一些自定义代码,但不知何故,这个看似简单的任务开始让人头疼。

我试过的一个例子:

import httplib
import base64
import urllib
import json

def getAuthToken():
    CLIENT_ID = "abcde"
    CLIENT_SECRET = "12345"
    TOKEN_URL = "https://api.example.com/oauth/access_token"

    conn = httplib.HTTPSConnection("api.example.com")

    url = "/oauth/access_token"

    params = {
        "grant_type": "client_credentials"
    }

    client = CLIENT_ID
    client_secret = CLIENT_SECRET

    authString = base64.encodestring('%s:%s' % (client, client_secret)).replace('\n', '')

    requestUrl = url + "?" + urllib.urlencode(params)

    headersMap = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Basic " + authString
    }

    conn.request("POST", requestUrl, headers=headersMap)

    response = conn.getresponse()

    if response.status == 200:
        data = response.read()
        result = json.loads(data)

        return result["access_token"]

那我有这个了:

import requests
import requests.auth

CLIENT_ID = "abcde"
CLIENT_SECRET = "12345"
TOKEN_URL = "https://api.example.com/oauth/access_token"
REDIRECT_URI = "https://www.getpostman.com/oauth2/callback"

def get_token(code):
    client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)
    post_data = {"grant_type": "client_credentials",
                 "code": code,
                 "redirect_uri": REDIRECT_URI}
    response = requests.post(TOKEN_URL,
                             auth=client_auth,
                             data=post_data)
    token_json = response.json()
    return token_json["access_token"]

如果这样可行,我应该在code 参数中添加什么

我真的希望有人可以在这里帮助我。

提前致谢。

【问题讨论】:

    标签: python google-oauth


    【解决方案1】:

    终于搞定了

    这是我使用的代码:

    class ExampleOAuth2Client:
        def __init__(self, client_id, client_secret):
            self.access_token = None
    
            self.service = OAuth2Service(
                name="foo",
                client_id=client_id,
                client_secret=client_secret,
                access_token_url="http://api.example.com/oauth/access_token",
                authorize_url="http://api.example.com/oauth/access_token",
                base_url="http://api.example.com/",
            )
    
            self.get_access_token()
    
        def get_access_token(self):
            data = {'code': 'bar',
                    'grant_type': 'client_credentials',
                    'redirect_uri': 'http://example.com/'}
    
            session = self.service.get_auth_session(data=data, decoder=json.loads)
    
            self.access_token = session.access_token
    

    【讨论】:

    • 你能解释一下你的代码吗?我似乎无法让它工作。提前致谢!
    • 有人能解释一下'code'下的'bar'是什么吗?一些随机字符串?某种网址?
    • 这是在使用 rauth 库吗?
    • 您能解释一下您的代码/提供完整的答案吗?你用过什么图书馆?什么是“酒吧”?
    【解决方案2】:

    简单(在 Facebook 身份验证的情况下):

    import requests, json
    
    access_token = requests.get("https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=your_client_id&client_secret=your_client_secret").json()["access_token"]
    

    或者你可以使用rauth library

    docs 中有一个有趣的 facebook oAuth2 身份验证示例:

    from rauth import OAuth2Service
    
    facebook = OAuth2Service(
    client_id='your_client_id',
    client_secret='your_client_secret',
    name='facebook',
    authorize_url='https://graph.facebook.com/oauth/authorize',
    access_token_url='https://graph.facebook.com/oauth/access_token',
    base_url='https://graph.facebook.com/')
    

    打开会话后:

    session = facebook.get_auth_session(data={'code': 'foo','redirect_uri': redirect_uri})
    

    在会话 json 中有你的访问令牌

    【讨论】:

    • rauth 库的最后一次提交是在 2015 年,这个库还在维护吗?
    • 我会说不。尝试 'oauthlib',它似乎很受欢迎,并在 9 天前(2020 年 8 月 7 日)提交了
    【解决方案3】:

    使用前需要pip install requests

    import requests
    
    
    def get_access_token(url, client_id, client_secret):
        response = requests.post(
            url,
            data={"grant_type": "client_credentials"},
            auth=(client_id, client_secret),
        )
        return response.json()["access_token"]
    
    
    get_access_token("https://api.example.com/access_token", "abcde", "12345")
    

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 2012-01-23
      • 2020-04-10
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多