【问题标题】:How do I perform oauth2 for Sabre Dev Network using python?如何使用 python 为 Sabre Dev Network 执行 oauth2?
【发布时间】:2014-09-04 00:34:21
【问题描述】:

我正在尝试从 Sabre Dev Studio 获取身份验证令牌。我遵循此处给出的通用说明https://developer.sabre.com/docs/read/rest_basics/authentication(需要登录才能查看),但我无法弄清楚如何使用 Python 获取令牌 - 特别是使用 python-oauth2 库,因为它似乎被推荐用于简化流程。

这是我的代码示例:

config = ConfigParser.ConfigParser()
config.read("conf.ini")
clientID = config.get('DEV', 'Key').strip()
clientSecret = config.get('DEV', 'SharedSecret').strip()

consumer = oauth.Consumer(key=base64.b64encode(clientID), 
                          secret=base64.b64encode(clientSecret))

# Request token URL for Sabre.
request_token_url = "https://api.sabre.com/v1/auth/token"

# Create our client.
client = oauth.Client(consumer)

# create headers as per Sabre Dev Guidelines https://developer.sabre.com/docs/read/rest_basics/authentication
headers = {'Content-Type':'application/x-www-form-urlencoded'}
params = {'grant_type':'client_credentials'}

# The OAuth Client request works just like httplib2 for the most part.
resp, content = client.request(request_token_url, "POST", headers=headers)

print resp
print content

响应为 401 类型。凭据不完整或格式错误。 任何建议表示赞赏。

【问题讨论】:

    标签: python oauth-2.0 sabre


    【解决方案1】:

    首先获取您的凭据:

    1. https://developer.sabre.com/member/register注册
    2. 登录https://developer.sabre.com
    3. 转到https://developer.sabre.com/apps/mykeys 并获取您的凭据。它们应该看起来像这样(垃圾邮件和鸡蛋看起来像垃圾):

      client_id = 'V1:spam:DEVCENTER:EXT'
      client_secret = 'eggs'
      

    然后调用/v2/auth/token端点以获取访问令牌:

    import requests
    credentials = ":".join([part.encode('base64').strip() 
                            for part in (client_id, client_secret)]
                     ).encode('base64').strip()
    
    url = 'https://api.test.sabre.com/v2/auth/token'
    headers = {'Authorization': 'Basic ' + credentials}
    params = {'grant_type': 'client_credentials'}
    
    r = requests.post(url, headers=headers, data=params)
    assert r.status_code is 200, 'Oops...'
    token = r.json()
    print(token)
    

    你应该得到这样的东西:

    {u'access_token': u'T1RLAQJwPBoAuz...x8zEJg**', 
     u'token_type': u'bearer', 
     u'expires_in': 604800}
    

    现在您可以使用包含您的访问令牌的 Authorization 标头调用其他端点。例如,如果您想要支持的国家/地区列表:

    headers = {'Authorization': 'Bearer ' + token[u'access_token']}
    endpoint = 'https://api.test.sabre.com/v1/lists/supported/countries'
    r = requests.get(endpoint, headers=headers)
    assert r.status_code is 200, 'Oops...'
    
    print (r.json())
    

    如果一切顺利,您应该会收到支持的国家/地区列表:

    {u'DestinationCountries': [
       {u'CountryName': u'Antigua And Barbuda', u'CountryCode': u'AG'}, 
       {u'CountryName': u'Argentina', u'CountryCode': u'AR'}, 
       {u'CountryName': u'Armenia', u'CountryCode': u'AM'}, 
       {u'CountryName': u'Aruba', u'CountryCode': u'AW'},
       ...
    }
    

    【讨论】:

      【解决方案2】:

      我很确定您正在使用这个 oauth 库:https://pypi.python.org/pypi/oauth2 尽管被命名为“oauth2”,但它并没有实现 OAuth 2 规范。这是我能找到的最好的库,它提供 OAuth 2 支持并有文档:http://requests-oauthlib.readthedocs.org/en/latest/oauth2_workflow.html

      【讨论】:

        【解决方案3】:

        我不能使用 oauth2,但我使用 requests 包 I think you can get it from here

        我的代码是:

        import requests
        import base64
        import json
        
        
        def encodeBase64(stringToEncode):
            retorno = ""
            retorno = base64.b64encode(stringToEncode)    
            return retorno
        
        
        parameters = {"user": "YOUR_USER", "group": "YOUR_GROUP", "domain": "YOUR_DOMAIN", "password": "YOUR_PASSWORD"}
        
        endpoint = "https://api.test.sabre.com/v1"
        
        urlByService = "/auth/token?="
        url = endpoint + urlByService
        user = parameters["user"]
        group = parameters["group"]
        domain = parameters["domain"]
        password = parameters["password"]
        encodedUserInfo =  encodeBase64("V1:" + user + ":" + group + ":" + domain)
        encodedPassword =  encodeBase64(password)
        encodedSecurityInfo = encodeBase64(encodedUserInfo + ":" + encodedPassword)
        data = {'grant_type':'client_credentials'}
        headers = {'content-type': 'application/x-www-form-urlencoded ','Authorization': 'Basic ' + encodedSecurityInfo}
        
        response = requests.post(url, headers=headers,data=data)
        
        print "Post Request to: " + url
        print response
        print "Response Message: " + response.text
        

        问候,

        【讨论】:

          猜你喜欢
          • 2016-06-13
          • 2011-08-05
          • 2017-07-23
          • 2012-10-29
          • 2021-10-24
          • 2020-02-25
          • 2012-02-20
          • 2021-04-10
          相关资源
          最近更新 更多