【问题标题】:Laravel auth AJAX no popupLaravel auth AJAX 没有弹出窗口
【发布时间】:2014-04-16 05:56:19
【问题描述】:

我一直在经历这个tutorial

从终端 cURL 请求一切正常,但在使用 jQuery 时我得到一个用于身份验证的弹出窗口。有没有办法阻止这个弹出窗口并将登录凭据从 jQuery 传递到 API? --user 究竟是如何从终端工作的,我如何从 jQuery 中“模拟”这个?

终端:

$ curl --user username:password http://localhost/api/v1/email
{"error":false,"authEmail":"me@localhost","message":"request success"}

Laravel 控制器方法:

public function index() {
    return Response::json(array(
        'error' => false,
        'authEmail' => Auth::user()->email,
        'message' => 'request success'), 200);
}

Laravel 过滤器:

Route::filter('auth.basic', function() {
return Auth::basic('username');
});

Laravel 路线:

Route::group(array('prefix' => 'api/v1', 'before' => 'auth.basic'), function() {
Route::resource('email', 'EmailController');
});

jQuery:

(function($) {
$(document).ready(function() {
    $.ajax({
        url: 'http://localhost/api/v1/email',
        type: 'GET',
        dataType: 'json',
        data: {
            username: 'username',
            password: 'password'
        }
    }).complete(function(data) {
        console.log(data.responseJSON);
    });
});
})(jQuery);

【问题讨论】:

    标签: php jquery ajax laravel laravel-4


    【解决方案1】:

    您可以在 jQuery ajax 请求中添加用户名和密码设置:

     $.ajax({
            url: 'http://localhost/api/v1/email',
            type: 'GET',
            dataType: 'json',
            username: 'username',
            password: 'password'
        }).complete(function(data) {
            console.log(data.responseJSON);
    });
    

    我认为应该可以。

    【讨论】:

    • 这似乎正在工作,因为我现在得到了一个有效的 JSON 响应,但我也看到了一个控制台错误:“NetworkError: 401 Unauthorized - username:password@localhost/api/v1/email”。考虑到身份验证正在工作,知道这个错误是什么吗?
    【解决方案2】:

    您可以使用 beforeSend 回调添加认证信息:

    (function($) {
    
        $(document).ready(function() {
    
            ajax({
    
                url: 'http://localhost/api/v1/email',
    
                type: 'GET',
    
                dataType: 'json',
    
                beforeSend: function(xhr) { xhr.setRequestHeader(
    
                    "Authorization",     
    
                    "Basic " + btoa('username' + ":" + 'password')); }
    
                })
    
                .complete(function(data) {console.log(data.responseJSON)})
    
        });
    
    })(jQuery);
    

    【讨论】:

    • 酷这完美的作品。那么对于其他 API,您也必须这样做吗?只是设置标题的问题?我假设这同样适用于 PHP?
    • 使用基本认证时需要设置headers。普通身份验证使用 POST 数据或您设置使用的任何数据,但 HTTP 基本身份验证是 HTTP 标准的一部分,需要正确的标头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多