前后端常见的几种鉴权方式(小结)

yizhihongxing

前后端常见的几种鉴权方式(小结)

1. 基于Token的鉴权方式

Token(令牌)是指在Web开发中,保留客户端登录状态的一种机制。具体实现方式为:当用户使用用户名和密码进行登录后,系统生成一个特定的Token,并返回给客户端。此后客户端必须携带此Token才能访问受保护的资源。

具体流程如下:

  1. 客户端发送登录请求;
  2. 服务端验证用户信息;
  3. 登录成功后,生成Token,并返回给客户端;
  4. 客户端收到Token后,在每次请求时都附加在请求头中;
  5. 服务端对每次请求的Token进行校验,如果校验通过,则返回结果,否则拒绝请求。

如下是一个示例验证过程的代码实现,包括生成Token、校验Token、鉴权等具体步骤:

import jwt

# 生成Token函数
def generate_token(user_id):
    # 设置Token过期时间
    exp = datetime.datetime.utcnow() + datetime.timedelta(days=1)
    # 放入用户的id,并设置过期时间
    return jwt.encode({'user_id': user_id, 'exp': exp}, 'my_secret_key', algorithm='HS256')

# 校验Token函数
def verify_token(token):
    try:
        # 解码Token,获取用户id信息
        payload = jwt.decode(token, 'my_secret_key', algorithms=['HS256'])
        # 判断Token是否过期
        if payload['exp'] < datetime.datetime.utcnow():
            raise jwt.ExpiredSignatureError
    except (jwt.InvalidSignatureError, jwt.DecodeError, jwt.ExpiredSignatureError):
        # Token校验失败,则返回None
        return None
    # 校验通过,返回用户id
    return payload['user_id']

# 鉴权函数
def authenticated(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Token
        token = request.headers.get('Authorization')
        if token is None:
            # Token未提供,返回错误信息
            raise Unauthorized
        # 校验Token
        user_id = verify_token(token)
        if user_id is None:
            # Token校验失败,返回错误信息
            raise Unauthorized
        # 鉴权通过,返回结果
        return func(*args, **kwargs)
    return wrapper

# 测试代码
@app.route('/protected_resource')
@authenticated
def protected_resource():
    return 'This is a protected resource'

2. 基于Session的鉴权方式

Session(会话)是指客户端和服务器之间建立的一种持久连接,用于保持用户登录状态等。具体实现方式为:当用户使用用户名和密码进行登录后,服务端在服务器上创建一个Session,并将该Session的唯一标识(Session ID)返回给客户端。此后客户端每次发送请求时,都要附带该Session ID,以便服务端能够识别该请求是否是登录用户的请求。

具体流程如下:

  1. 客户端发送登录请求;
  2. 服务端验证用户信息;
  3. 登录成功后,创建一个Session,并将Session ID返回给客户端;
  4. 客户端收到Session ID后,在每次请求时都附加在请求头中;
  5. 服务端对每次请求的Session ID进行校验,如果校验通过,则返回结果,否则拒绝请求。

如下是一个示例验证过程的代码实现,包括创建Session、校验Session、鉴权等具体步骤:

# 创建Session函数
def create_session(user_id):
    session_id = uuid.uuid4().hex
    redis_client.set(session_id, user_id, ex=3600)
    return session_id

# 校验Session函数
def verify_session(session_id):
    user_id = redis_client.get(session_id)
    if user_id is None:
        # Session校验失败,返回错误信息
        raise Unauthorized
    return user_id

# 鉴权函数
def authenticated(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Session ID
        session_id = request.headers.get('Session-ID')
        if session_id is None:
            # Session未提供,返回错误信息
            raise Unauthorized
        # 校验Session
        user_id = verify_session(session_id)
        # 鉴权通过,返回结果
        return func(*args, **kwargs)
    return wrapper

# 测试代码
@app.route('/protected_resource')
@authenticated
def protected_resource():
    return 'This is a protected resource'

3. 基于权限的鉴权方式

基于权限的鉴权方式是指通过授权,给予用户访问特定资源的权限,从而实现鉴权的一种方式。授权的方式可以通过以下两种方式进行:

  1. 角色授权:将具有相似权限的用户归为同一角色,并给予这些角色特定的访问权限;
  2. 用户授权:针对每个用户,给予其特定的访问权限。

具体流程如下:

  1. 客户端发送登录请求;
  2. 服务端验证用户信息;
  3. 登录成功后,根据用户角色或者用户特定权限,返回相应的访问权限;
  4. 客户端在请求时携带相应的权限信息;
  5. 服务端根据接收到的权限信息,进行鉴权。

如下是一个示例验证过程的代码实现,包括权限管理、校验权限、鉴权等具体步骤:

# 权限管理
permissions = {
    'admin': ['view_users', 'edit_users', 'delete_users', 'view_inventory', 'edit_inventory', 'delete_inventory'],
    'finance': ['view_users', 'view_inventory', 'view_sales'],
    'sales': ['view_users', 'edit_users', 'view_inventory', 'view_sales', 'edit_sales']
}

# 校验权限函数
def verify_permission(user_id, permission):
    user = get_user(user_id)  # 获取用户信息
    if user is None:
        raise Unauthorized
    if permission not in user['permissions']:
        raise Forbidden

# 鉴权函数
def authenticated(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Token或者Session ID
        token = request.headers.get('Authorization')
        session_id = request.headers.get('Session-ID')
        if token is None and session_id is None:
            # 无法确定用户身份,返回错误信息
            raise Unauthorized
        # 根据Token或者Session ID获取用户信息
        if token is not None:
            user_id = verify_token(token)
        else:
            user_id = verify_session(session_id)
        # 根据用户信息和访问权限进行鉴权
        verify_permission(user_id, 'view_users')
        # 鉴权通过,返回结果
        return func(*args, **kwargs)
    return wrapper

# 测试代码
@app.route('/protected_resource')
@authenticated
def protected_resource():
    return 'This is a protected resource'

通过以上示例,我们可以看到基于Token、Session、权限这三种方式,都具有其特定的优缺点,需要在实际项目中具体情况具体分析。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前后端常见的几种鉴权方式(小结) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 深入解析koa之中间件流程控制

    以下就是“深入解析koa之中间件流程控制”的详细攻略: 什么是中间件 中间件指的是在请求到达目标处理程序之前,对请求进行一些预处理、中转、处理、过滤等操作的代码。可以把中间件看作是一个管道,请求流经这个管道,在管道中的每个中间件都有机会修改或处理请求并将其传递给下一个中间件,最终到达处理程序或返回响应数据给浏览器。 在 Koa 应用中,中间件使用 async…

    node js 2023年6月8日
    00
  • 用Nginx反向代理Node.js的方法

    使用Nginx反向代理Node.js是一种常见的解决方案,可以提高网站的性能和可靠性,同时保护应用程序免受攻击。以下是使用Nginx反向代理Node.js的完整攻略: 1. 安装和配置Node.js应用程序 第一步是安装和配置Node.js应用程序。这里以Express框架为例进行说明: 步骤一:安装Node.js 可以从Node.js官网下载最新版本的No…

    node js 2023年6月8日
    00
  • Ajax异步文件上传与NodeJS express服务端处理

    一、介绍本文将讲解如何使用Ajax异步上传文件并在NodeJS的express服务端进行处理。本文将分为以下步骤:1. 简单介绍Ajax异步上传文件的原理;2. 编写客户端的HTML、CSS、JavaScript代码实现文件上传功能;3. 编写服务端的NodeJS express代码实现文件上传后的处理;4. 给出两个实例供读者参考。 二、原理Ajax异步上…

    node js 2023年6月8日
    00
  • koa+mongoose实现简单增删改查接口的示例代码

    我来给你讲解一下 “koa+mongoose实现简单增删改查接口的示例代码”的完整攻略。 一、前期准备 在开始编写代码之前,我们需要先准备一些工作: 安装koa和koa-router npm install koa koa-router –save 安装mongoose npm install mongoose –save 创建并连接数据库 在进行增删改…

    node js 2023年6月8日
    00
  • node.js使用Moment.js js 时间计算方法示例小结

    Node.js是一种基于Chrome V8 JavaScript引擎构建的JavaScript运行时工具,它使得JavaScript能够在服务器端运行,同时还支持NPM(Node Package Manager)模块化开发,这为Node.js带来了强大的扩展能力。而Moment.js是一种用于解析、格式化和操作日期对象的JavaScript库,它易于使用且具…

    node js 2023年6月8日
    00
  • NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解

    请看下面的攻略 NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解 1. 下载安装包 进入NodeJS官网(https://nodejs.org/en/),下载对应系统的安装包,本攻略以windows版本为例。 2. 安装NodeJS 双击下载好的安装包,按照提示进行安装。安装完成后,在命令行中输入以下命令,如果能够正常输出版本号,则表…

    node js 2023年6月8日
    00
  • Node中文件断点续传原理和方法总结

    下面是详细讲解“Node中文件断点续传原理和方法总结”的完整攻略。 简介 文件断点续传是指在文件下载或上传过程中,若因网络等原因中断,再次续传时可以从断点处接着传输,而不必重新开始。在Node.js中,我们可以使用HTTP断点续传头来实现文件断点续传。 HTTP断点续传头 HTTP断点续传头是指在HTTP请求头中设置Range和If-Range字段,从而实现…

    node js 2023年6月8日
    00
  • node-webkit打包成exe文件被360误报木马的解决方法

    下面是“node-webkit打包成exe文件被360误报木马的解决方法”的完整攻略。 问题描述 在使用node-webkit对Web应用进行打包成exe文件后,有时会被安全软件如360误报木马,从而影响用户信任度和使用体验。 解决方法 1. 使用数字签名证书 数字签名证书是一种用于确认软件作者身份、确保数据完整性和不可否认性的加密技术。通过对打包后的exe…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部