前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >说说web应用程序中的用户认证

说说web应用程序中的用户认证

作者头像
somenzz
发布于 2020-11-25 02:25:17
发布于 2020-11-25 02:25:17
2.3K0
举报
文章被收录于专栏:Python七号Python七号

阅读本文大概需要 3 分钟。

我们都知道 web 应用程序分两个部分,即前端和后端。

前端发送请求,后端返回数据。这里后端是指服务器,前端是指浏览器。

后端只能收到前端发送的请求头,请求参数,及资源定位符(url)。在没有用户认证的情况下,无论前端是谁,只要发送的请求一样,后端返回的数据也是一样的,前端人人平等,后端对他们一视同仁。

随着技术的发展,用户的增加,后端的服务器越来越跑不动了,因为前端的请求太多了,有些资源并不想让所有用户查看,还有些是恶意请求,会导致服务器崩溃(DDoS 攻击)。

因此,后端必须验证前端的身份,根据前端是否拥有相应的权限,来确定是否返回对应的数据。于是很多网站都有用户登陆、注册功能,只有登陆的用户才可能做更多的事情。

但是 http 设计之初是无状态的,也就是说每次请求,服务器都认为这是一个新的请求,之前的请求是否发生过,服务器并不知道。用户登陆时服务器验证通过,但用户的下一次请求时,服务器已不记得用户是否登陆过,这就需要借助一些额外的工具来实现有状态的请求。这就是 cookie(小甜品)。

用户第一次登陆服务器时,服务器生成一些和用户相关联的信息,比如 session_id,token,user_id,可能是一个,也可能是多个,都是经过加密的,把这些信息放在 cookie 中,返回给前端用户,用户下一次请求时,附带上这个 cookie ,服务器拿到这个 cookie,就知道用户之前已经登陆过了,这就变成了有状态的请求。

服务器可以设置相关信息的过期时间,比如 2 个小时,那么用户登陆网站后,2 个小时内未做任何操作,那么 2 个小时后,再次发送请求,服务器就会认为未登陆,需要重新登陆。

登陆后的一系列请求,借助于 cookie,服务器就能确认是哪个用户,然后根据角色、权限确认哪些用户拥有哪些资源的访问权限,这样就实现了用户认证,权限控制等一系列复杂的功能。

那么问题来了,使用 Django Rest Framework 框架实现后端 REST API 时,如何做好用户认证呢?

在 Django Rest Framework 中,认证功能是可插拨的,非常方便。REST框架提供了现成的身份验证方案,如下。并且还允许您实现自定义方案。

1、BasicAuthentication 此身份验证方案使用 HTTP 基本身份验证,该身份针对用户的用户名和密码进行了签名。基本身份验证通常仅适用于测试。

2、TokenAuthentication 此身份验证方案使用简单的基于令牌的 HTTP 身份验证方案。令牌认证适用于客户端-服务器设置,例如台式机和移动客户端。

3、SessionAuthentication 此身份验证方案使用 Django 的默认会话后端进行身份验证。会话身份验证适用于在与您的网站相同的会话上下文中运行的 AJAX 客户端。

4、RemoteUserAuthentication 通过此身份验证方案,您可以将身份验证委派给 Web 服务器。

但是对于需要前后端分离的生产环境来说,方式 1 不适用,官方已经说明仅适用于测试。方式 4 也不适用,没有多少人愿意委派别人来验证自己的用户。方式 2 并不安全,可能导致 XSS 攻击,方式 3 采用 django 默认的会话后端,适用于在与网站相同的会话上下文中运行的 AJAX 客户端,也不适用前后端分离这种方式。

这里必须要自己实现自定义的验证吗?其实不然,这里我推荐使用: JSON Web Token,也就是 django-rest-framework-jwt 安全加密功夫做得比较足,而且工作原理也清楚明了,使用也简单。适合用于向 Web 应用传递一些非敏感信息,经常用于设计用户认证和授权系统,实现 Web 应用的单点登录

Json Web Token(JWT)

JWT 是一个开放标准 (RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。

JWT 使用方法:

  1. 首先,前端通过 Web 表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个 HTTP POST 请求。建议的方式是通过 SSL 加密的传输(https协议),从而避免敏感信息被嗅探。
  2. 后端核对用户名和密码成功后,将用户的 id 等其他信息作为 JWT Payload(负载),将其与头部分别进行 Base64 编码拼接后签名,形成一个 JWT。形成的JWT 就是一个字符串。
  3. 后端将 JWT 字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在 localStorage 或 sessionStorage 上,退出登录时前端删除保存的 JWT 即可。
  4. 前端在每次请求时将 JWT 放入 HTTP Header 中的 Authorization 位。(解决XSS 和 XSRF 问题)
  5. 后端检查是否存在,如存在,则验证 JWT 的有效性。例如,检查签名是否正确;检查 Token 是否过期;检查 Token 的接收方是否是自己(可选)。
  6. 验证通过后后端使用 JWT 中包含的用户信息进行其他逻辑操作,返回相应结果。

阅读原文发表你的看法。

专注于Python技术分享

欢迎订阅、在看、转发

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊 微服务 架构中的用户认证方案
我们直奔主题,什么是用户认证呢?对于大多数与用户相关的操作,软件系统首先要确认用户的身份,因此会提供一个用户登录功能。用户输入用户名、密码等信息,后台系统对其进行校验的操作就是用户认证。用户认证的形式有多种,最常见的有输入用户名密码、手机验证码、人脸识别、指纹识别等,但其目的都是为了确认用户的身份并与之提供服务。
码猿技术专栏
2023/05/01
9370
聊聊 微服务 架构中的用户认证方案
Java面试指北!13个认证授权常见面试题/知识点总结!| JavaGuide
我发现有很多小伙伴对认证授权方面的知识不是特别了解,搞不清 Session 认证、JWT 以及 Cookie 这些概念。
Guide哥
2021/06/17
1.1K0
硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!
大家好,我是Guide哥!相信很多人对认证授权方面都不是特别了解,搞不清Session认证、JWT以及 Cookie 这些概念。所以,根据我根据日常对这部分学习已经在项目中的实际运用总结了这8 个相关的问题并且附上了详细的回答(这篇文章这么晚才发的原因)。
Guide哥
2020/05/07
9150
从零开始做网站7-整合shiro+jwt实现用户认证和授权
上一篇用shiro来登入存在用户认证的问题,而又不想用cookie session,所以决定使用jwt来做用户认证
sunonzj
2022/06/21
1.2K0
从零开始做网站7-整合shiro+jwt实现用户认证和授权
Gin框架dgrijalva/jwt-go实例(JWT用户认证)
JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息, 一个JWT由三部分组成,
OwenZhang
2021/12/08
8620
Gin框架dgrijalva/jwt-go实例(JWT用户认证)
用户认证(Authentication)进化之路:由Basic Auth到Oauth2再到jwt
    用户认证是一个在web开发中亘古不变的话题,因为无论是什么系统,什么架构,什么平台,安全性是一个永远也绕不开的问题
用户9127725
2022/08/08
1K0
python测试开发django-61.权限认证(permission)
用户登录后,才有操作当前用户的权限,不能操作其它人的用户,这就是需要用到权限认证,要不然你登录自己的用户,去操作别人用户的相关数据,就很危险了。
上海-悠悠
2019/09/17
2K0
python测试开发django-61.权限认证(permission)
基于JWT实现用户身份认证
JWT(JSON WEB TOKEN) 是目前最流行的跨域认证解决方案,是一种基于Token认证授权机制,JWT自身包含了身份验证所需要的所有信息,因此我们服务端不需要存储Session信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端压力
才疏学浅的木子
2023/10/17
3480
更加优雅的Token认证方式JWT
通过上一篇你大体已经了解session和cookie认证了,session认证需要服务端做大量的工作来保证session信息的一致性以及session的存储,所以现代的web应用在认证的解决方案上更倾向于客户端方向,cookie认证是基于客户端方式的,但是cookie缺点也很明显,到底有哪些缺点可以跳转上一次的文章。那有没有一种比较折中的方案呢?有的
架构师修行之路
2019/09/09
1.3K0
python测试开发django-60.token登录(TokenAuthentication)
现在很多接口项目在登录的时候返回一个token,登录后的拿着这个token去访问访问登录之后的请求。 本篇使用djangorestframework框架写一个登陆的接口,登录成功后返回token。 环境准备: python 3.6 django 2.1.2
上海-悠悠
2019/09/17
3K0
python测试开发django-60.token登录(TokenAuthentication)
前后端分离之JWT用户认证(转)
在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了。于是我们的程序就不知道谁是谁,就要再验证一次。所以为了保证系统安全,我们就需要验证用户否处于登录状态。
二十三年蝉
2018/08/27
1.6K0
前后端分离之JWT用户认证(转)
Django+Vue开发生鲜电商平台之7.用户登录和注册功能
Github和Gitee代码同步更新: https://github.com/PythonWebProject/Django_Fresh_Ecommerce; https://gitee.com/Python_Web_Project/Django_Fresh_Ecommerce。
cutercorley
2020/07/30
4.5K0
Django+Vue开发生鲜电商平台之7.用户登录和注册功能
Web应用的会话、认证与安全
HTTP协议最初是匿名的、无状态的,一次请求和响应一旦结束,客户端和服务端的连接就会关闭,服务器没有信息可以用来判断哪个用户发送的请求,也无法跟踪用户会话。
搬砖俱乐部
2019/06/15
1.5K0
基于jwt和session用户认证的区别和优缺点
Authentication:用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码确认你真的是小A。
Java宝典
2021/01/14
2K0
基于jwt和session用户认证的区别和优缺点
FastAPI从入门到实战(8)——一文弄懂Cookie、Session、Token与JWT
HTTP 是无状态的。也就是说,HTTP 请求方和响应方间无法维护状态,都是一次性的,它不知道前后的请求都发生了什么。但有的场景下,我们需要维护状态。最典型的,一个用户登陆微博,发布、关注、评论,都应是在登录后的用户状态下的。这种情况下,各种鉴权就应运而生了。
MinChess
2022/12/27
4.9K0
FastAPI从入门到实战(8)——一文弄懂Cookie、Session、Token与JWT
JWT原理构成与使用(带案例简单易懂)[通俗易懂]
现在,前端与后端分处不同的域名,这就涉及到跨域访问数据的问题,因为浏览器的同源策略,默认是不支持两个不同域间相互访问数据,而我们需要在两个域名间相互传递数据,这时我们就要为后端添加跨域访问的支持。
全栈程序员站长
2022/11/07
9310
JWT原理构成与使用(带案例简单易懂)[通俗易懂]
到底什么是认证?什么是授权?
认证 (Authentication) 是根据凭据验明访问者身份的流程。即验证“你是你所说的那个人”的过程。
程序视点
2025/01/17
1920
到底什么是认证?什么是授权?
什么是JWT(JSON WEB TOKEN)
转自于:http://www.jianshu.com/p/576dbf44b2ae
莫问今朝
2018/08/31
1.1K0
什么是JWT(JSON WEB TOKEN)
DJANGO的用户认证系统
Django自带的用户认证系统,为开发者提供了许多在用户登陆登出方面的快捷开发命令。这篇博文为初学者讲解如何使用django的用户认证系统。 Django版本2.X
KEVINGUO_CN
2020/03/17
1.5K0
cookie和token
前言 本文将首先概述基于cookie的身份验证方式和基于token的身份验证方式,在此基础上对两种验证进行比较。 最后将介绍JWT(主要是翻译官网介绍)。 概述 HTTP是一个“无状态”协议,这意味着Web应用程序服务器在响应客户端请求时不会将多个请求链接到任何一个客户端。然而,许多Web应用程序的安全和正常运行都取决于系统能够区分用户并识别用户及其权限。 这就需要一些机制来为一个HTTP请求提供状态。它们使站点能够在会话期间对各用户做出适当的响应,从而保持跟踪用户在应用程序中的活动(请求和响应)。 co
大蟒传奇
2018/06/20
2.4K0
推荐阅读
相关推荐
聊聊 微服务 架构中的用户认证方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档