Команда curl в сценарии оболочки возвращает ошибку {"Error": "bpapigw-300 не может авторизовать доступ к ресурсу" - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь выполнить curl с помощью этого сценария оболочки:

#!/bin/bash

curl -k -H "Content-Type:application/json" -d '{"username":"admin","password":"adminpw", "tenant":"master"}' https://localhost/tron/api/v1/tokens > /tmp/token.data

grep -Po '{\"token\":\"\K[^ ]...................' /tmp/token.data > /tmp/token

tokendetails=`cat /tmp/token`
for token in $tokendetails
do
  TOKEN=`echo $token`
done
userdetails=`cat /tmp/curloutput.txt | sed 's/{"clientInactivityTime"/\n{"clientInactivityTime"/g' | sed 's/\(.*\).\("firstName":[^,]*\)\(.*\)\("lastName":[^,]*\)\(.*\)\("email":[^,]*\)\(.*\)\("username":[^,]*\)\(.*\)/\2,\4,\6,\8/g' | grep username`

for user in $userdetails
do
  firstName=`echo $user | sed 's/,/\n/g' | grep firstName | sed 's/.*:"\([^"]*\).*/\1/g'`
  lastName=`echo $user | sed 's/,/\n/g' | grep lastName | sed 's/.*:"\([^"]*\).*/\1/g'`
  email=`echo $user | sed 's/,/\n/g' | grep email | sed 's/.*:"\([^"]*\).*/\1/g'`
  username=`echo $user | sed 's/,/\n/g' | grep username | sed 's/.*:"\([^"]*\).*/\1/g'`


curl -k -X POST "https://haxsne09/tron/api/v1/users" -H "accept: application/json" -H "Authorization: Bearer =${TOKEN}" -H "Content-Type: application/x-www-form-urlencoded" -d "first_name=${firstName}\&last_name=${lastName}\&email=${email}\&password=Tata123^\&username=${username}\&is_active=true"



echo $RESPONSE
done

Я получаю эту ошибку:

{"Error":"bpapigw-300 Cannot authorize access to resource: Could not authorize path for user identifier: Failed to get Roles for identifier: REST operation  failed 0 times: '[GET /api/v1/current-user][401] currentUserListUnauthorized  \u0026{Detail:Invalid token}'. This user is unauthenticated?"}

Нужно ли добавлять какой-либо синтаксис перед выполнением curl -k -X POST

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Используемый вами заголовок Authorization не работает.Возможно, синтаксис не Bearer =aAbBcCdDeEfF0123456, а что-то еще для сервера, работающего на haxsne09, возможно, без =, как предлагает @MarcoS.В качестве альтернативы, ваша команда grep может возвращать слишком много символов (возможно, нецензурная цитата).

Я переписал ваш код ниже, чтобы сделать его более читабельным.Вы заметите, что я:

  • Изменил соответствующие группы в sed, чтобы захватывать только необходимые части и помещать их в переменные, используя read.Я также использовал флаг -E, чтобы избежать необходимости использовать \( и \)
  • Удалил ненужные циклы for
  • Правильно процитировал все расширения переменных
  • Добавлены некоторые разрывы строк для удобства чтения
  • Удалены некоторые временные файлы и связанные с ними бесполезные использования cat

Вот обновленный скрипт:

#!/bin/bash

curl -k -H 'Content-Type:application/json' -d \
  '{"username":"admin","password":"adminpw", "tenant":"master"}' \ 
  https://localhost/tron/api/v1/tokens > /tmp/token.data

token=$(grep -Po '{"token":"\K[^ ]...................' /tmp/token.data)

IFS=, read -r firstName lastName email username < <(
  </tmp/curloutput.txt sed 's/{"clientInactivityTime"/\n&/' |
  sed -nE 's/.*."firstName":"([^"]*)".*"lastName":"([^"]*)").*"email":"([^"]*).*"username":"([^"]*)".*/\1,\2,\3,\4/p'
)

curl -k -X POST 'https://haxsne09/tron/api/v1/users' -H 'accept: application/json' \
  -H "Authorization: Bearer $token" -H "Content-Type: application/x-www-form-urlencoded" -d \
  "first_name=$firstName&last_name=$lastName&email=$email&password=Tata123^&username=$username&is_active=true"

echo
0 голосов
/ 05 февраля 2019

Я вижу, что -H "Authorization: Bearer =${TOKEN}" содержит знак =, которого там быть не должно ...
Это должно быть: -H "Authorization: Bearer ${TOKEN}"

Больше, в команде, которую вы используете /tmp/curloutput.txt файл, который никогда не создается вашим скриптом ...

...