Передать заголовок header

Discussion in 'Песочница' started by ceg, 6 Jan 2022.

  1. ceg

    ceg New Member

    Joined:
    2 Aug 2011
    Messages:
    28
    Likes Received:
    4
    Reputations:
    0
    Ребят, никак не могу передать заголовок Authorization, который передается в каждом запросе типа:

    PHP:
    $jwt "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9";
    $headers = [
    "Authorization: ".$jwt,
    ];
    Мой код:

    В одном файле формирую данные:
    PHP:
    /* ........ */
    $checkSum "";
            
    $paramList = array();
            
    $paramList["wallet_to"]        = $this->wallet_to;
            
    $paramList["sum"]            = $amount;
            
    $paramList["order_id"]        = $tnx_id;
            
    $paramList["hook_url"]        = cn("add_funds/lava/complete");
            
    $paramList["success_url"]   = cn("add_funds/success");
            
    $paramList["fail_url"]      = cn("add_funds/unsuccess");
            
    $paramList["expire"]        = $this->lava_expiretime;
            
    $paramList["subtract"]        = $this->lava_substract;
            
    $paramList['comment']         = $this->lava_comment;
    $data = array(
               
    'paramList' => $paramList,
               
    'checkSum'  => $checkSum,
           );
    $this->load->view("lava/redirect"$data);
    В другом файле форму: (redirect.php)
    HTML:
    <div class="dimmer active" style="min-height: 400px;">
      <div class="loader"></div>
      <div class="dimmer-content">
        <center><h2><?php echo lang('please_do_not_refresh_this_page'); ?></h2></center>
        <form method="get" action="https://api.lava.ru/invoice/create" name="f1" id="payment_method_form">
          <?php
          foreach($paramList as $name => $value) {
            echo '<input type="hidden" name="' . $name .'" value="' . $value . '">';
          }
          ?>
          <script type="text/javascript">
            $(function() {
              document.getElementById("payment_method_form").submit();
            });
          </script>
        </form>
      </div>
    </div>
    
    Как же мне сюда можно внедрить передачу заголовка? Крутил и туда, и сюда, и curl пихал, но не получается никак.
     
    #1 ceg, 6 Jan 2022
    Last edited: 6 Jan 2022
  2. fandor9

    fandor9 Reservists Of Antichat

    Joined:
    16 Nov 2018
    Messages:
    630
    Likes Received:
    1,050
    Reputations:
    47
    Вам надо как минимум исправить код для заголовка, там не хватает слова Bearer перед самим JWT токен.
    PHP:
    $jwt "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9";
    $headers = [
    "Authorization: Bearer ".$jwt,
    ];
    что-бы передавать заголовки, можете использовать Жабускрипт и:
     
    eminlayer7788, erwerr2321 and K800 like this.
  3. ceg

    ceg New Member

    Joined:
    2 Aug 2011
    Messages:
    28
    Likes Received:
    4
    Reputations:
    0
    Взял с документации https://docs.lava.ru/primery-raboty-s-api/php

    Вместо:
    HTML:
    <div class="dimmer active" style="min-height: 400px;">
      <div class="loader"></div>
      <div class="dimmer-content">
        <center><h2><?php echo lang('please_do_not_refresh_this_page'); ?></h2></center>
        <form method="get" action="https://api.lava.ru/invoice/create" name="f1" id="payment_method_form">
          <?php
          foreach($paramList as $name => $value) {
            echo '<input type="hidden" name="' . $name .'" value="' . $value . '">';
          }
          ?>
          <script type="text/javascript">
            $(function() {
              document.getElementById("payment_method_form").submit();
            });
          </script>
        </form>
      </div>
    </div>
    пишу:

    HTML:
    <div class="dimmer active" style="min-height: 400px;">
      <div class="loader"></div>
      <div class="dimmer-content">
        <center><h2><?php echo lang('please_do_not_refresh_this_page'); ?></h2></center>
        <form method="get" action="https://api.lava.ru/invoice/create" name="f1" id="payment_method_form">
          <?php
          foreach($paramList as $name => $value) {
            echo '<input type="hidden" name="' . $name .'" value="' . $value . '">';
          }
          ?>
          <script type="text/javascript">
         
    var http = new XMLHttpRequest();
                var url = 'https://api.lava.ru/invoice/create';
                var params = '';
                http.open('POST', url, true);
             
                //Send the proper header information along with the request
                http.setRequestHeader('Authorization','Bearer '+'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9');
                http.onreadystatechange = function() {//Call a function when the state changes.
                    if(http.readyState == 4 && http.status == 200) {
                        alert(http.responseText);
                    }
                }
                console.log(this.responseText);
                http.send(params);
         
          </script>
        </form>
      </div>
    </div>
    
    Получаю в консоле ошибки:
    undefined
    Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на https://api.lava.ru/invoice/create. (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»). Код состояния: 200.
    Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на https://api.lava.ru/invoice/create. (Причина: не удалось выполнить запрос CORS). Код состояния: (null).


    Куда стоит копать дальше?
     
  4. ceg

    ceg New Member

    Joined:
    2 Aug 2011
    Messages:
    28
    Likes Received:
    4
    Reputations:
    0
    Сделал все таки с помощью curl.

    Вариант сработал, но посмотрите, можно ли оставлять такой вариант получения данных и перенаправление страницы? Пробовал перенаправлять с помощью header - ошибка в консоле по поводу запрета чтения удаленного ресурса.

    PHP:
    $url "https://api.lava.ru/invoice/create";
            
    $headers = ["Authorization: ".$this->lava_apikey,];
       
            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_URL$url);
            
    curl_setopt($chCURLOPT_POSTtrue);
            
    curl_setopt($chCURLOPT_POSTFIELDS$paramList);
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($chCURLOPT_HEADERfalse);
            
    curl_setopt($chCURLOPT_HTTPHEADER$headers);
            
    $result curl_exec($curl);
            
    $response json_decode(curl_exec($ch),true);
            
    curl_close($ch);
            
    $redirecturl $response["url"];

    echo 
    "<script>self.location='$redirecturl';</script>";
     
    eminlayer7788 and fandor9 like this.
  5. fandor9

    fandor9 Reservists Of Antichat

    Joined:
    16 Nov 2018
    Messages:
    630
    Likes Received:
    1,050
    Reputations:
    47
    Так как вы делаете запрос с источника, который отличается от цели, из-за политики общего происхождения ("same-origin policy") то браузер не даёт читать/использовать данные которые получает в ответе. По идее API должен отдавать в ответах CORS заголовки "Access-Control-Allow-Origin" со значением либо * (любой источник может читать/использовать информацию ответов) либо же со значением подходящее под источник "Access-Control-Allow-Origin: hxxps://test.ololo.ru/"
     
    ceg likes this.