如何使用Python获取oauth2 access_token

Joh*_*eer 9 python google-oauth2

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

在Postman中,这非常有效.

身份验证网址:https://api.example.com/oauth/access_token
访问令牌网址: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"]
Run Code Online (Sandbox Code Playgroud)

然后我有这个:

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"]
Run Code Online (Sandbox Code Playgroud)

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

我真的希望有人可以帮助我.

提前致谢.

Mar*_*oma 26

在使用它之前,您需要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")
Run Code Online (Sandbox Code Playgroud)

识别client_id客户端,client_secret验证客户端。您会收到access_token后续请求。

还有一些替代名称:

  • client_id:Salesforce 中的“消费者密钥”
  • client_secret:Salesforce 中的“消费者秘密”
  • access_token: oauth 令牌


Joh*_*eer 11

我终于完成了它

这是我使用的代码:

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
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下你的代码吗?我似乎无法让它发挥作用.提前致谢! (7认同)
  • 有人可以解释“代码”下的“栏”是什么?一些随机的字符串?某种网址? (2认同)