2017-06-22 3 views
1

Permettez-moi de préface en disant que je suis probablement en train de négliger quelque chose de simple.Comment s'authentifier auprès de l'API Bluemix CF à l'aide de Python

Je tente d'écrire une manipulation de mon compte Bluemix avec Python et l'API CF.

d'abord se rendre à https://api.ng.bluemix.net/info pour obtenir le authorization_endpoint, https://login.ng.bluemix.net/UAALoginServerWAR/

response = requests.get('https://api.ng.bluemix.net/info') 

puis après à authorization_endpoint pour obtenir des jetons OAuth.

results = response.json() 
auth_endpoint = results['authorization_endpoint'] + 'oauth/token?grant_type=password&client=cf' 
http_payload = { 
    'username': id, 
    'password': pw, 
    'client_id': 'cf' 
    } 
auth = ('cf', '') 
response = requests.post(auth_endpoint, data=http_payload, auth=auth) 

Utilisez ensuite le jeton OAuth retourné pour appeler l'API CF, dans ce cas https://api.ng.bluemix.net/v2/organizations.

results = response.json() 
url = 'https://api.ng.bluemix.net/v2/organizations' 
authorization = results['token_type'] + ' ' + results['access_token'] 
http_headers = { 
    'accept': 'application/json', 
    'content-type': 'application/json', 
    'authorization': authorization 
    } 
response = requests.get(url, headers=http_headers) 

Mais il en résulte une 404, { "description": "demande inconnue", "error_code": "CF-NotFound", "code": 10000}. Est-ce la bonne approche? Que suis-je en train de négliger?

Répondre

1

Cela fonctionne pour moi:

id = 'changeme' 
pw = 'changeme' 

import json 
import urllib 
import requests 

response = requests.get('https://api.ng.bluemix.net/info') 
results = response.json() 
auth_endpoint = results['authorization_endpoint'] + '/oauth/token' 

data = 'grant_type=password&username={0}&password={1}'.format(id, pw) 
auth = ('cf', '') 
headers = { 
    'accept': 'application/json', 
    'content-type': 'application/x-www-form-urlencoded;charset=utf-8' 
    } 
response = requests.post(auth_endpoint, data=data, headers=headers, auth=auth) 

results = response.json() 
url = 'https://api.ng.bluemix.net/v2/organizations' 
authorization = results['token_type'] + ' ' + results['access_token'] 
http_headers = { 
    'accept': 'application/json', 
    'content-type': 'application/json', 
    'authorization': authorization 
    } 
response = requests.get(url, headers=http_headers) 

print(response.text) 

Retours:

{ 
    "total_results": 6, 
    "total_pages": 1, 
    "prev_url": null, 
    "next_url": null, 
    "resources": [ 
    ... 
} 
+0

Merci, oui. Cela fonctionne pour moi aussi. Je cherchais au mauvais endroit pour mon erreur. Je pensais que c'était avec la façon dont je produisais le jeton. Mais après avoir obtenu mon accès au travail avec des commandes curl, j'ai réalisé que mon erreur était une faute de frappe plus simple et plus stupide. L'URL que j'ai utilisée était https: \\ api.ng.bluemix.net \ V2 \. À un moment donné, j'ai réussi à capitaliser le «v». – user2085050