OAuth 1.0 Генерация подписи против Postman Генерация подписи

Я пишу инструмент для API плагина Woocommerce, который является одним из плагинов WordPress. Этот инструмент использует для аутентификации систему OAuth 1.0. Когда я устанавливаю свой запрос и отправляю его через Postman, я могу без проблем получить ответ. Моя проблема начинается в тестовом приложении, которое я написал сам. Когда я создаю подпись с теми же значениями, что и в Postman, я нахожу другое значение из инструмента Postman.

В документе указано несколько базовых строк. Я шифрую это значение указанным ключом и создаю подпись. Эта подпись совпадает с подписью на документе. Итак, отсюда я могу понять, что мой тестовый инструмент работает без сбоев. (https://oauth.net/core/1.0a/#RFC2045 — Приложение A.5.2. Расчет значения подписи)

Когда я добавляю значения, которые я получаю от Postman с помощью того же инструмента, в свой тестовый инструмент, я получаю разные результаты. Мне пришло в голову, что инструмент Postman добавил еще один параметр.

Мои ценности Почтальона:

введите здесь описание изображения

Я могу работать с этими значениями без проблем. Добавляю те же значения в тестовое приложение и получаю вывод;

введите здесь описание изображения

Почтальон: tcBdkwXJL9Ad5RZFTQ36Vh34mYM=

Мое тестовое приложение: UJ2it9opCslL0Jjy7/T/C7Dw8rc=

Я разрабатываю соответствующее тестовое приложение с Delphi. Если вам нужны коды, я поделился ими ниже.

procedure TForm1.Button1Click(Sender: TObject);
var
 p1, p2, full: string;
begin
 p1 := cmbReqType.Text;

 p2 :=  TNetEncoding.URL.Encode(edit1.Text);
 p3 := 'oauth_consumer_key=' + oauth_consumer_key.Text
        + '&oauth_signature_method='+oauth_signature_method.Text
        + '&oauth_timestamp='+oauth_timestamp.Text +
        '&oauth_nonce=' + oauth_nonce.Text +
        '&oauth_version='+ oauth_version.Text;

 xp3 := p3;
 p3 := TNetEncoding.URL.Encode(p3);
 full := p1 + '&' + p2 + '&' + p3;
 Memo1.Lines.Text := System.UTF8Encode(Trim(full));

 HMAC_SHA1 := THashSHA1.Create;
 Edit2.text := TNetEncoding.Base64.EncodeBytesToString(HMAC_SHA1.GetHMACAsBytes(TEncoding.UTF8.GetBytes(Trim(memo1.text)), TEncoding.UTF8.GetBytes(Trim(secret_key.Text))));

 if Trim(Edit2.Text) = 'tcBdkwXJL9Ad5RZFTQ36Vh34mYM=' then
 begin
   ShowMessage('correct.');
 end else
     begin
       ShowMessage('not correct.');
     end;
end;

P.S. Забудьте об уродстве в коде. Я закодировал это тривиально :)

P.S. Подобные темы оставляю ниже. Большинство не отвечает на ответ.

1- Как просмотреть необработанную подпись, которую Postman использует при выполнении запросов OAuth?

2- Как почтальон отдыхает Клиент создает подпись Oauth? Не удалось разрешить Oauth_Signature в Android

...

Заранее спасибо за вашу помощь в этом.


person Halil Han Badem    schedule 13.07.2021    source источник
comment
oauth_nonce должен идти сразу после oauth_consumer_key (поскольку параметры должны быть отсортированы по имени).   -  person Olivier    schedule 13.07.2021
comment
Оливер; Не могу передать, как я счастлив сейчас. Я благодарен вам. Я решил проблему с вашим исправлением и добавил дополнительную ситуацию. Первым шагом было изменить порядок, как вы сказали. Ну, я не мог понять, почему они избежали этой ситуации в примерах, приведенных в документах. Еще одно исправление заключалось в том, что я добавил & рядом с секретным ключом. Причина этого в том, что oauth_token и секретный ключ должны быть рядом. Поскольку у меня не было токенов, символа слияния (&) было достаточно. Например. cs_9388....58aa464845& . Если вы добавите это как ответ, я бы хотел одобрить и проголосовать.   -  person Halil Han Badem    schedule 13.07.2021


Ответы (1)


При построении базовой строки подписи OAuth1 требует, чтобы параметры были отсортированы по имени. В вашем случае это означает, что oauth_nonce должно идти сразу после oauth_consumer_key.

Кроме того, при вычислении HMAC ключ должен включать как Consumer Secret, так и Token. Секрет, разделенный &, даже если токен пуст. Поскольку у вас нет токена, вы должны добавить & к своему секрету.

person Olivier    schedule 13.07.2021