0

我的移动应用程序需要登录 Moodle 以从 Web 服务获取 Json 数据并使用 Angular 显示它。

为此,我需要传入用户名和密码并取回 Moodle 网络服务令牌,因此我的应用不需要再次登录(至少在令牌过期之前)。

(这是“提出并回答你自己的问题”的事情之一,所以我的解决方案如下,但欢迎提出意见和建议。)

感谢我用来创建此解决方案的所有其他 StackOverflow 页面!

另请参阅-如何使用 Angular 从 Moodle 网络服务获取数据

4

1 回答 1

1

步骤 1. 检查令牌是否已存在

jQuery(document).ready(function () {

/* when the user clicks log-out button, destroy the session */

    $('#btn_logout').on('click', function () {
        $('.pane').hide();  /* hide all screens */
        $('#menu').toggleClass('ui-panel-open ui-panel-closed');
        $.jStorage.deleteKey('session');
        makeUserLogin();
    });

        var session = $.jStorage.get('session', ''); // syntax: $.jStorage.get(keyname, "default value")


        if (session) { // if  there is already a session, redirect to landing pane

             showApp();

        } else {   // if there is no session *then* redirect to the login pane

           makeUserLogin();

        }

});

步骤 2. 创建功能以显示应用程序并重定向到登录页面

function showApp() {
    $('#home-pane').show(); /* show home screen */
    $('#system-message').hide();
    $('#login-pane').hide();  /* hide login screen*/
    $('#menu_btn').removeClass('hidden'); /* show menu button so user can see rest of app */
}

function makeUserLogin() {

    $('#btn_login').click(function () {
        console.log('click event for login_button');

        var username = $('#username').val();
        var password = $('#password').val();

        postCredentials(username, password, createSession);

    });

    $('#menu_btn').addClass('hidden');  /* hide menu button so user cannot see rest of app */
    $('#home-pane').hide();  /* hide home screen */
    $('#login-pane').show(); /* show login screen */
}

function postCredentials(username, password, callback) {
    if ((username.length && password.length) && (username !== '' && password !='')) {

        var url = 'https://moodle.yourcompany.com/local/login/token.php';
        $.post(url, {
             username: username,
             password: password,
             service: 'webservice_ws' // your webservice name
         }).done(function (data) {
             token = data.token;
             dataString = JSON.stringify(data);
             if (dataString.indexOf('error') > 0) {
               showErrorDialog('<p class="error">Invalid user credentials, please try again</p>');
             }
             else {
                  createSession(token); 
             }

         }).fail(function () {
             showErrorDialog('<p class="error">Login failed</p>');
         });

    } else {
        showErrorDialog('<p class="error">Please enter a username and password</p>');
    }
}

function createSession(token) {

// syntax:  $.jStorage.set('keyname', 'keyvalue', {TTL: milliseconds}); // {TTL... is optional time, in milliseconds, until key/value pair expires}
    $.jStorage.set('session', token, { TTL: 28800000 });
// redirect to whatever page you need after a successful login
    showApp();
}

function showErrorDialog(errorMsg) {
    $('#system-message').html(errorMsg);
    $('#system-message').fadeIn();
}
于 2016-09-02T10:33:17.053 回答