最近项目中需要对普通认证HTTP basic Authorization和摘要认证HTTP Digest authenticatio登录进行注销。搜索到有几篇文章号称ie,Firefox、chrome都可以可以注销,其实根本不能,真是垃圾。这块资料比较少,坑比较多。这个破事儿翻搭来翻搭去有一阵子,后来彻底解决。
①前端:注销可以采用的方法如下,如果有效则不再需要后端处理了:
请在前端js注销处理函数中调用AuthLogout()
function AuthLogout(page) {
if (!page) page = '/';
try {
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") != -1 ||agt.indexOf("trident") != -1) {
// IE clear HTTP Authentication
document.execCommand("ClearAuthenticationCache");
}
else {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", page, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send(null);
}
} catch(e) {
return;
}
return;
}
②后端:我目前后端使用python flask编写。注销功能需要清理服务器的session,在摘要认证有效的,但普通认证无效。后来发现认证注销只需要服务器返回401认证失败错误码即可,前端浏览器会认为密码错误,会要求重新进行登录认证。如果前端的方案无效,那么这个后台接口需要前端调用一次就OK了。
注销函数如下:
@authapi.route('/logout', methods=['GET', 'POST'])
@auth.login_required
def logout():
respond = make_response(json.dumps({"code": "0000", "message": "Logout successful", "data": {}}, ensure_ascii=False))
respond.mimetype = "application/json"
try:
session.clear()
except Exception as e:
respond.data = json.dumps({"code": "0001", "message": "Logout failed", "data":{}}, ensure_ascii=False)
return respond,401
总结:原理也适用其他后台开发。您要觉得对你有用的话,请给我点个赞吧:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)