如何使用带有worklight的基于适配器的身份验证中的Web服务将authRequired和WL.Server.invokeHttp值返回给客户端?

时间:2015-09-29 00:19:32

标签: javascript angularjs ibm-mobilefirst

编辑:我正在使用基于适配器的身份验证与worklight和angularJs。点击登录按钮我正在调用 submitLogin 程序,并在参数中传递用户名和密码,如下所述。我的查询是在调用适配器之后我将如何将authRequired值和WL.Server.invokeHttp(输入)响应同时返回给客户端。我还提到了登录服务代码中的身份验证挑战处理程序

适配器代码:

function submitLogin(username, password){
    WL.Logger.debug("username: "+username);
    var payload = {
            "Header": {
                "header": {
                    "myschemeName": "",
                    "myserviceVersion": "0.00",
                   "myinternalId": "",
                    "myexternalId": "",
                    "mysource": "web",
                    "mydestination": "test",
                    "myuserId": ""
                }
            },
            "Body": {
                "login": {
                    "username": username,
                    "password": password
                }
            }
        }
    var input = {
        method : 'post',
        returnedContentType : 'jsonp',
        path: '/mywebservices/login',
        headers : {
            'Accept-Encoding': 'gzip,deflate',
            'Content-Type': 'application/json'
        },
        body: { 
                    'contentType' : 'application/json',         
                    'content' : payload
                }
    };

    return {authRequired: false, WL.Server.invokeHttp(input);};
}

登录服务:

angular.module('my.services')
       .factory('loginServices', function($http, $q, $rootScope) {
           'use strict';

            //worklight
            var realm = "AdapterAuthRealm";
            var securityTest = "Master-Password";
            //offline
            var offlineAuthed = false;
            var tempUser = {};
            //user object
            var userObj = {};
            //login popup
            userObj.dialog = false;
            //login error message
            userObj.authError = "";
            //logged in boolean
            userObj.loggedIn = null;

            var defunct = null;

            //change handler
            var ch = WL.Client.createChallengeHandler(securityTest);

            //first response after protected call
            ch.isCustomResponse = function(response){ 
                console.log("challenge handler -- isCustomResponse");
                if (!response || !response.responseJSON || response.responseText === null) {
                    return false;
                }
                if (typeof(response.responseJSON.authRequired) !== 'undefined'){
                    return true;
                } else {
                    return false;
                }
            };

            //when isCustomResponse returns true
            ch.handleChallenge = function(response){ 
                console.log("challenge handler -- handleChallenge");
                var err = response.responseJSON.errorMessage;
                var req = (String(response.responseJSON.authRequired) == "true");
                if (!req){ //successful login request
                    console.log("-> login success!");
                    //create offline auth credentials
                    createOfflineAuth();
                    //call the success function of initial adapter call 
                    //ch.submitSuccess();
                } 
                //error message
                userObj.authError = "";
                if (err != null){
                    userObj.authError = "* " + err;
                }
                //login boolean
                userObj.loggedIn = !req;
                //show login popup
                userObj.dialog = req;
                //update scope
                $rootScope.$apply();
                //resolve original function if it exists
                if (defunct != null){
                 defunct.resolve(userObj.loggedIn);
                }
            };

            //**  Offline  **//
            //check if user is online
            function checkOnline(){
                var def = $q.defer();
                WL.Client.connect({
                    onSuccess: function(){
                        console.log("** User is online!");
                        def.resolve(true);

                    },
                    onFailure: function(){
                        console.log("** User is offline!");
                        def.resolve(false);
                    },
                    timeout: 1000
                });
                return def.promise;
            }

            //creates an offline authentication object
            function createOfflineAuth(){
                console.log("creating offline auth");
                //encrypt the user object
                var encyptedUser = md5(angular.toJson(tempUser));
                //save to local storage
                localStorage.setItem(tempUser.username, encyptedUser);
                //clear tempUser
                tempUser = {};
            }

            //offline login
            function offlineLogin(){
                userObj.authError = "";
                //encrypt the tempuser object
                var match = md5(angular.toJson(tempUser));
                var savedAuth = localStorage.getItem(tempUser.username);
                //check if matching the saved one
                offlineAuthed = (savedAuth == match);
                console.log("Login successfull: " + offlineAuthed);
                //error - mismach
                if (!offlineAuthed){
                    userObj.authError = "* Wrong login details.";
                }
                //error - if the user has never authenticated with the server
                if (savedAuth == null){
                    userObj.authError = "* You have to go online first.";
                }
                //login boolean
                userObj.loggedIn = offlineAuthed;
                //show login popup
                userObj.dialog = !offlineAuthed;
                return offlineAuthed;
            }


            //-- APIS to the rest of the app --//

            return {

                getUser: function(){
                    return userObj;

                },

                initUser: function () {
                    console.log("-> getting user state data");
                    var def = $q.defer();
                    checkOnline().then(function (onl){
                        if (onl){ //online
                            WL.Client.updateUserInfo({onSuccess: function(){    
                                userObj.loggedIn = WL.Client.isUserAuthenticated(realm);
                                def.resolve();
                            }});
                        } else { //offline
                            userObj.loggedIn = false;
                            def.resolve();
                        }
                    });
                    return def.promise;
                },

                checkUser: function () {
                    var def = $q.defer();
                    checkOnline().then(function (onl){
                        if (onl){ //online
                            userObj.loggedIn = WL.Client.isUserAuthenticated(realm);
                        } else { //offline
                            userObj.loggedIn = offlineAuthed;
                        }
                        userObj.dialog = !userObj.loggedIn;
                        //check success
                        if (!userObj.loggedIn){
                            //save the deferred for challengehandler
                            defunct = def;
                        } else {
                            //resolve
                            def.resolve(true);
                        }
                    });
                    return def.promise;
                },

                login: function (user,pass){
                    //promise
                    var logindef = $q.defer();
                    //tempuser
                    tempUser = {username:user, password:pass};
                    userObj.user = user;
                    checkOnline().then(function (onl){
                    if (onl){ //online
                            console.log("attempting online login");
                            var options = {
                                parameters:[user, pass],    
                                adapter:"myAdapter",
                                procedure:"submitLogin"
                            };
                            ch.submitAdapterAuthentication(options,{
                                onSuccess: function(){
                                    console.log("-> submitAdapterAuthentication onSuccess!");
                                    //update user info, as somehow isUserAuthenticated return false without it
                                    WL.Client.updateUserInfo({onSuccess: function(){    
                                        //return promise
                                        logindef.resolve(true);
                                    }});


                                    }
                            });
                    } else { //offline
                            console.log("attempting offline login");
                            logindef.resolve(offlineLogin());
                        }
                    });
                    return logindef.promise;
                }
            };
        });

1 个答案:

答案 0 :(得分:1)

我想解密你的问题。它根本不清楚。

然而,有一件事情已经跳出来了。 在您的适配器中,您完成了:

JButton btnEdituj = new JButton("Edituj"); btnEdituj.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/csprogram","root",""); String query= "UPDATE `maticna ploca` SET `naziv`=value1,`socketi (socket1, socket2)`=value2,`chipset`=value3,`vga port`=value4,`RAM tip i MHz`=value5,`HDD`=value6,`Cijena (KM)`=value7,`Dodatno`=value8 WHERE 'naziv'=value1"; PreparedStatement pst=conn.prepareStatement(query); pst.setString(1, textField_1.getText()); pst.setString(2, textField_2.getText()); pst.setString(3, textField_3.getText()); pst.setString(4, textField_4.getText()); pst.setString(5, textField_5.getText()); pst.setString(6, textField_6.getText()); pst.setString(7, textField_7.getText()); pst.setString(8, textField_8.getText()); pst.execute(); JOptionPane.showMessageDialog(null, "Data updated"); pst.close(); } catch (Exception d) { d.printStackTrace(); }

即使在检查凭据是否有效之前,您还说authRequired为false? 您应该解析适配器内return {authRequired: false, WL.Server.invokeHttp(input);};的结果内容,确定凭据是否有效。

如果它们有效,请在返回WL.Server.invokeHttp(input) setActiveUser之前使用authRequired。 不要将false的内容返回给客户。这适用于要解析的适配器。

请参阅本教程:https://developer.ibm.com/mobilefirstplatform/documentation/getting-started-7-1/foundation/authentication-security/adapter-based-authentication/

相关问题