Bonjour à tous.

Nouveau sur LARAVEL, je me tourne vers vous pour resoudre un probleme.
J ai une API sous laravel sui envoi des données json, elle est "protegée" par une demande d'authentifiation basic (auth.basi.
Voici la route

Route::group(['middleware' => 'auth.basic'], function () {
Route::get('v1/all_ter', 'StatsController@statos');
});

A travers un navigateur, tout marche....

https://blabla.com/api/v1/all_ter

Une boite /dialog me demande un log/pass et apres authentification , j ai bien ma réponse :

[{"ID":11,"ref":"T01-D","id_ville":1,"commentaire":"SPE"},{"ID":12,"ref":"T01-B","id_ville":1,"commentaire":"Semaine SPE"}, }]

Jusque là, pas de probleme.

Mais je dois attaquer l 'api par une autre application via jquery

D 'où le code suivant dans mon client :

Ce que je fais

var myuser ='xxxxx@xxxx.com';

            var mypswd = 'yyyyyyyy';

            $.ajaxSetup({

            headers: {

            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')

            }

            });

            $.ajax

                    ({

                        type: 'GET',

                        url: 'https://blabla.com/api/v1/all_ter',

                        dataType: 'json',

                        beforeSend : function(xhr) {

                        var credentials = btoa(myuser + ':' + mypswd);

                        xhr.setRequestHeader("Authorization", "Basic " + credentials);

                        },

                        success: function (){

                        alert('Thanks for your comment!');

                        },

                         error: function(XMLHttpRequest, textStatus, errorThrown) {

                                    alert("Status: " +textStatus + " " +errorThrown);

                                }

                    });


B en.. ca ne marche pas... une question de token je pense.. une idee ??

3 réponses


Bonjour,
Est-ce que tu as regardé quelle type d'erreur dans ta console?

Bonjour.
Quelle version utilises-tu de jQuery ?
Car si tu utilises la V3 ou supérieur, les callbacks success et error sont dépréciés :

Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

Source.

Par contre, ce que je ne comprends pas, c'est comment tu peux avoir un token CSRF dans les meta dans une autre application ?
Normalement les token CSRF c'est interne à l'application qui utilise ce token, justement pour éviter qu'une requête soit effectuée depuis une autre application.
Donc logiquement, tu devrais désactiver la vérification CSRF dans la partie de ton API lorsque les requêtes ne sont pas effectuées depuis l'application qui héberge ton API.
Je ne suis pas certain d'avoir été très clair dans mes propos, mais tant pis.

alexei
Auteur

Alors.. merci pour vos reponses.

Le code du "client"

<!DOCTYPE html>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
<html>
<body>

<a class="addf" href="#">V2</a></p>
</body>

<script type="text/javascript">

$(".addf").click( function()
     {        
        var myuser ="xxxxxx@aol.com";
        var mypswd = "xxxxxx@";
        $.ajax({
              type: "GET",
              url: 'http://blabla.com/api/v1/books',
              //dataType: 'json',

                beforeSend: function (xhr) {
                    xhr.setRequestHeader ("Authorization", "Basic " + btoa(myuser + ":" + mypswd));
                },
                 success:function(html){ alert(html);},
                error:function(XMLHttpRequest, textStatus, errorThrows){
                    alert(textStatus+" "+errorThrows);
                },
              });

           });

</script>

</html>

@Lartak :=> CSRF est bien desactivé pour l api

L entete de la requete :
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Origin: null
DNT: 1
Connection: keep-alive

La réponses (Avec un beau 401 unauthorized)

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Cache-Control: no-cache, private
Connection: Keep-Alive
Content-Length: 20
Content-Type: text/html; charset=UTF-8
Date: Sun, 28 Jan 2018 16:15:56 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.6 (CentOS) PHP/5.6.32
WWW-Authenticate: Basic
X-Powered-By: PHP/5.6.32
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58

Merci