Jquery .ajax fails when basic auth username has @ symbol (ios / cordova)

后端 未结 3 446
無奈伤痛
無奈伤痛 2021-01-02 16:32

I have a phonegap app w/ jQuery 1.9.1 Worked great as long as the username doesn\'t have \'@\' symbol in it (like in email addresses). It only fails on iOS.

I suspec

相关标签:
3条回答
  • 2021-01-02 17:13

    Try wrapping encodeURIComponent() before base64 encoding.

    beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization",
                "Basic " + $.base64.encode(encodeURIComponent(this.username + ":" + this.password)));
        },
    
    0 讨论(0)
  • 2021-01-02 17:15

    I would bet the problem is not using a contentType : "application/x-www-form-urlencoded".

    Anyway, you should definitely debug your Webview against a real device, to look for xhr errors on the Safari console. If you are not familiar with Safari remote debugging, it's easy:

    • in your iPhone/iPad, go to Settings -> Safari -> Advanced => Enable Web Inspector.
    • connect to MacOSX via cable, and select your app from the "Develop" menu of Safari in your desktop
    • Now check any errors regarding your request, or better yet, debug the code and callbacks step by step.
    0 讨论(0)
  • 2021-01-02 17:26

    When base64encoded text is UNencoded on the other end, it still looks like (as you said), user@domain:password@blah.domain.com Try having a function like this:

    var getAuthToken = function (user, pass) {
        var token = "";
        if (user) {
            token = token + encodeURIComponent(user);
        }
        if (pass) {
            token = token + ":" + encodeURIComponent(pass);
        }
        token = $.base64.encode(token);
        return "Basic " + token;
    };
    

    Then just change your code slightly:

    xhr.setRequestHeader("Authorization", getAuthToken(this.username, this.password));
    
    0 讨论(0)
提交回复
热议问题