【问题标题】:Open InAppBrowser with Authorization Header使用授权标头打开 InAppBrowser
【发布时间】:2016-07-02 16:36:24
【问题描述】:

对于我的 Ionic2 应用,我需要下载发票,但仅适用于经过身份验证的用户。有什么办法吗?

我已经安装了 InAppBrowser cordova 插件,但它似乎不能用于发送带有请求的授权标头。

【问题讨论】:

  • 你解决了吗?

标签: angular cordova ionic2 basic-authentication angular2-http


【解决方案1】:

这对我有用: 查找 (YourProject)\plugins\cordova-plugin-inappbrowser\src\android\InAppBrowser.java 文件并编辑它。

在文件末尾的 onReceivedHttpAuthRequest 中,您应该输入类似这样的内容。

    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {

        // Check if there is some plugin which can resolve this auth challenge
        String UserName = getUser();
        String Password = getPass();

        if (UserName != null && Password!= null) {
            handler.proceed(UserName, Password);
            return;
        }

您可以将getUser()getPass() 替换为您的用户名和密码,以尝试是否有效,如果有效。创建从输入中检索数据的方法。

就我而言,我使用这个:

public void setUserPass(String username, String password) {
    this.USUARIO = username;
    this.CONTRASENA = password;
}    

public String getUser() {
    return this.USUARIO;
}

public String getPass() {
    return this.CONTRASENA;
}

在包含 onReceivedHttpAuthRequest 方法的 InAppBrowserClient 方法之外。然后几乎在文档的顶部我在execute方法中写了这个(setUserPass(args.getString(3), args.getString(4));)

public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {
    if (action.equals("open")) {
        this.callbackContext = callbackContext;
        final String url = args.getString(0);
        setUserPass(args.getString(3), args.getString(4));
        String t = args.optString(1);
        if (t == null || t.equals("") || t.equals(NULL)) {
            t = SELF;
        }
        final String target = t;

然后你必须在最后编辑 (YourProject)\plugins\cordova-plugin-inappbrowser\www\inappbrowser.js 文件。

module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) {
    // Don't catch calls that write to existing frames (e.g. named iframes).
    if (window.frames && window.frames[strWindowName]) {
        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
        return origOpenFunc.apply(window, arguments);
    }

    strUrl = urlutil.makeAbsolute(strUrl);
    var iab = new InAppBrowser();

    callbacks = callbacks || {};
    for (var callbackName in callbacks) {
        iab.addEventListener(callbackName, callbacks[callbackName]);
    }

    var cb = function(eventname) {
       iab._eventHandler(eventname);
    };

    strWindowFeatures = strWindowFeatures || "";

    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures[0], strWindowFeatures[1], strWindowFeatures[2]]);
    return iab;
};

最后,在 index.js 或控制您的应用程序的任何 js 中使用相同的调用,但您使用功能部分作为数组添加登录数据,如下所示:

window.open(url, '_blank', ['toolbar=no,presentationstyle=fullscreen,location=no,hardwareback=yes,hidden=no', username, password]);

要激活所有这些,您应该在控制台中构建项目。

希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    标头可以与请求一起发送兄弟,你试过这样吗:

    import {Http, Headers} from 'angular2/http';
    
    
        var headers = new Headers();
        headers.append('Authorization', 'Bearer ' + this.authToken));
        this.http.get('http://localhost:3333/getinfo', {headers: headers}).subscribe(data => {
        console.log(data);
    

    请看一下 - http://tphangout.com/?p=162 (它给出了关于提出授权请求的简单说明)。希望对您有所帮助。

    【讨论】:

    • 我需要从服务器下载pdf文件。我能从 http ajax 请求中下载 pdf 吗?
    • 我认为您需要在该 ajax 请求成功时创建一个 blob,然后创建一个 dataUrl 并从中流式传输下载。您可能还需要将 Content-type 标头设置为八位字节流和 Content-disposition 标头。请查看 - stackoverflow.com/questions/25490007/… 希望这对您有所帮助。让我知道它是否不起作用(或者如果它起作用,请在此处发布答案.. :))
    • 垃圾链接——不要点击。
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2017-12-08
    • 2018-08-13
    • 2016-07-15
    • 2021-09-04
    相关资源
    最近更新 更多