Получение токена OAuth2 из ansible tower с python? - PullRequest
2 голосов
/ 05 февраля 2020

Я пытаюсь получить / создать токен доступа OAuth2 с помощью этого python сценария:

import requests
import json

token_url = 'https://mytower.example.com/api/v2/tokens/'

data = {
    "description": "My Access Token",
    "application": 2,
    "scope": "write"
}

client_id = "I457Uue7...Ikdiafhjd"
client_secret = "Xvcgsh8...Ikadfi84"

user = 'myaccount'
passwd = 'that works in the UI'
# Get token
params = {"grant_type": "password", "username": user, "password": passwd}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
response = requests.post(token_url, auth=(client_id, client_secret), headers=headers, params=params, verify=False)
print(f'{response.status_code} {response.content}')
if response.status_code == 200:
  token = response.json()['access_token']
  print(token)

Когда я запускаю сценарий, я получаю эту ошибку:

401 b'{"detail":"Authentication credentials were not provided. To establish a login session, visit /api/login/."}'

I посмотрел документацию здесь: https://docs.ansible.com/ansible-tower/latest/html/administration/oauth2_token_auth.html но я не могу понять это.

Пожалуйста, помогите

ОБНОВЛЕНИЕ:

Когда я выполню этот python код:

import requests
import json

token_url = 'https://mytower.example.com/api/v2/tokens/'

headers = {"Content-Type": "application/json"}

user = 'me'
passwd = 'mypasswd'

# Get token
response = requests.post(token_url, verify=False, auth=(user, passwd))
print(f'{response.status_code} {response.content}')
token = response.json()['access_token']
print(token)

Я получаю этот вывод:

401 b'{"detail":"Authentication credentials were not provided. To establish a login session, visit /api/login/."}'

ОБНОВЛЕНИЕ II:

Хорошо, этот код получает токен:

import requests

token_url = 'https://mytower.example.com/api/v2/tokens/'

data = {
    "description": "My Access Token",
    "application": 2,
    "scope": "write"
}

headers = { 'Content-Type': 'application/json' }
gen_user = 'me'
gen_pass = 'mypassword'

# Get token
response = requests.post(token_url, auth=(gen_user, gen_pass), headers=headers, json=data, verify=False)
print(f'{response.status_code} {response.content}')

1 Ответ

1 голос
/ 07 февраля 2020

согласно официальной документации. Вы можете создать токен OAuth 2 с помощью приведенной ниже команды curl.

curl -u user:password -k -X POST https://<tower-host>/api/v2/tokens/

, которую можно преобразовать в Python с помощью пакета запроса с помощью

import requests

response = requests.post('https://<tower-host>/api/v2/tokens/', 
    verify=False, auth=('user', 'password'))

После того, как токен сгенерирован, он может использовать в других запросах, добавив его в заголовок запроса Authorization: Bearer <oauth2-token-value>.

Ссылка : https://www.ansible.com/blog/summary-of-authentication-methods-in-red-hat-ansible-tower

Обновление: Вы передаете данные как json и устанавливаете свойство Content-Type заголовка на application/x-www-form-urlencoded, которое должно быть application/json.

...