2

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

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

4

2 回答 2

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()and替换为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]);

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

希望这对某人有所帮助。

于 2017-04-12T20:55:27.313 回答
-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 (它提供了有关发出授权请求的简单说明)。希望这对您有所帮助。

于 2016-03-17T09:53:04.337 回答