如何用Python对Sabre开发网络进行OAuth2?
我正在尝试从Sabre开发者平台获取一个认证令牌。我按照这里提供的通用说明在操作 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错误,说明我的凭证不完整或者格式不正确。希望能得到一些建议。
3 个回答
0
我很确定你在用这个oauth库:https://pypi.python.org/pypi/oauth2。虽然它叫“oauth2”,但其实并没有完全按照OAuth 2的标准来实现。这里有一个我找到的最好的库,它支持OAuth 2,并且有详细的文档:http://requests-oauthlib.readthedocs.org/en/latest/oauth2_workflow.html
1
我用oauth2没成功,但用requests这个库成功了。我觉得你可以从这里下载
我的代码是:
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
祝好,
2
首先,你需要获取你的凭证:
- 在 https://developer.sabre.com/member/register 注册一个账号。
- 登录到 https://developer.sabre.com。
接着,去 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'},
...
}