刷新令牌后如何重新尝试操作 - jquery ajax

vin*_*ini 5 javascript asp.net ajax asp.net-mvc jquery

在我的流程中说我正在使用访问令牌来获取我的数据。当我的访问令牌过期时,我收到 401 错误我正在使用刷新令牌来获取新的访问令牌。

注意:我的访问令牌和刷新令牌存储在 cookie 中,我在 401 错误后更新相同。

我的问题我如何重试我在中间的相同操作?

我的代码(services.js):

 var refresh_token = "na";
function get_api_data(url, api_token) {
    var returnData = handleApiData(url, api_token, "GET");
    return returnData;
}

function post_api_data(url, api_token, post_data) {
    var returnData = handleApiData(url, api_token, "PUT", post_data);
    return returnData;

}

function handleApiData(url, access_token, type, post_data) {
    return $.ajax({
        url: url,
        type: type,
        data: post_data,
        error: failHandler,
        contentType: "application/json",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", "Bearer " + access_token);
        }
    })
}

function handleData(data, textStatus, jqXHR) {
    return data;
}

function failHandler(jqXHR, textStatus, errorThrown) {
    switch (jqXHR.status) {
        case 401:
            var api = get_api_token();
            checkApiToken(api.refresh_token);
            break;
        default:
            alert(errorThrown);


    }
}
function checkApiToken(refresh_token) {
    if (refresh_token != "na") {
        $.post("/Account/Refresh/?refresh_token=" + refresh_token);
        //location.reload();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码(notification.js):

 $(function () {
    var api = get_api_token();
    if (api != null)
        get_notification_data(api.access_token);

});

function get_notification_data(api_token) {

    var notifications = get_api_data(urls.notifications.list, api_token);
    if (notifications != undefined)
        notifications.success(function (data) {
            items = data.records;
            _.each(items, function (item) {
                item.Status = ko.observable(item.status);
                item.onClick = function () {
                    if (item.Status() === 'UNREAD') {
                        var post_data = { id: item.id };
                        post_api_data(urls.notifications.list, api_token, post_data).success(function (response, textStatus) {
                            if (response.success)
                                item.Status('READ');
                            $(location).attr("href", item.action_link);
                        });
                    }
                    else {
                        $(location).attr("href", item.action_link);
                    }

                }
            });
            var model = {
                items: ko.observableArray(items),
                onCancel: function (item) {
                }
            }
            ko.applyBindings(model, $("#notificationBar")[0]);
        })
}
Run Code Online (Sandbox Code Playgroud)

编辑:设置新 API cookie 的我的 AccountController 代码:

 [HttpPost]
    public ActionResult Refresh(string refresh_token)
    {
        string token_string = string.Empty;
        try
        {
            token_string = OAuthHelper.getTokenViaRefreshTokenFromAPIServer(refresh_token);
            if(token_string != null)
            Response.Cookies[Constants.Cookies.API].Value = token_string;
        }
        catch (Exception ex)
        {
            Log.Info(string.Format("AccountController.cs -Refresh Token Error ", ex.Message));

        }
       return RedirectToAction("Index","Home");
    }
Run Code Online (Sandbox Code Playgroud)