MST

星途 面试题库

面试题:Python中实现RESTful API身份认证的常用方式有哪些

在开发Python RESTful API时,阐述至少两种常见的身份认证方式,比如Token认证和基本认证,并简单说明每种方式在Python相关框架(如Flask或Django)中是如何实现的。
36.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Token认证

  1. 原理:客户端向服务器发送用户名和密码进行认证,服务器验证通过后生成一个Token(通常是加密字符串)返回给客户端。客户端后续请求都携带此Token,服务器通过验证Token来确认用户身份。
  2. 在Flask中的实现
    • 安装flask_httpauth库。
    • 示例代码:
from flask import Flask
from flask_httpauth import HTTPTokenAuth

app = Flask(__name__)
auth = HTTPTokenAuth(scheme='Bearer')

tokens = {
    "valid_token": "user1"
}

@auth.verify_token
def verify_token(token):
    return token in tokens

@app.route('/protected')
@auth.login_required
def protected():
    return "This is a protected route"

if __name__ == '__main__':
    app.run(debug=True)
  1. 在Django中的实现
    • 可以使用djangorestframework库。
    • 配置settings.py
INSTALLED_APPS = [
  ...
  'rest_framework',
  ...
]
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
      'rest_framework.authentication.TokenAuthentication',
    )
}
  • 生成Token:在models.py中,Token模型已经由rest_framework提供,通过manage.py命令python manage.py drf_create_token为用户生成Token,或者在代码中使用Token.objects.create(user=user)。客户端在请求头中携带Authorization: Token <token>

基本认证

  1. 原理:客户端在请求头中发送包含用户名和密码的Base64编码字符串。服务器接收到请求后,解码字符串并验证用户名和密码。
  2. 在Flask中的实现
    • 安装flask_httpauth库。
    • 示例代码:
from flask import Flask
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

users = {
    "user1": "password1"
}

@auth.verify_password
def verify_password(username, password):
    if username in users and users[username] == password:
        return True
    return False

@app.route('/protected')
@auth.login_required
def protected():
    return "This is a protected route"

if __name__ == '__main__':
    app.run(debug=True)
  1. 在Django中的实现
    • 同样可以使用djangorestframework库。
    • 配置settings.py
INSTALLED_APPS = [
  ...
  'rest_framework',
  ...
]
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
      'rest_framework.authentication.BasicAuthentication',
    )
}
  • 客户端在请求头中携带Authorization: Basic <base64编码的用户名:密码>