401 HTTP錯誤碼詳解

一、請求頭與身份認證

在HTTP協議中,客戶端向服務器發送請求時需要在請求頭中附帶一些信息,其中 Authorization 字段用於在請求中傳遞憑據信息。有些接口需要進行身份認證才能夠訪問,若用戶憑據錯誤或無效,則服務器會返回401錯誤碼。

例如,在以下代碼示例中,當請求頭中未附帶有效的Bearer Token時,則會返回401錯誤碼。

import requests

response = requests.get(url="http://example.com/api/v1/data", headers={"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"})

if response.status_code == 401:
  print("Invalid or missing auth token")

二、會話超時

當用戶登錄後長時間不操作,或者會話時間到期後再次訪問頁面時,服務器可能會返回401錯誤碼。這是因為在過期時間內未進行身份認證的話,會話失效。

為了避免會話失效,可以在每次用戶訪問時通過發送請求來快速刷新會話。下面的代碼示例中,發送POST請求充當「心跳」機制,使得會話時間得以存活。

import requests

session = requests.Session()
login_data = {"username": "my_username", "password": "my_password"}
session.post(url="http://example.com/login", data=login_data)

while True:
    response = session.post(url="http://example.com/keepalive")

    if response.status_code == 401:
        print("Session expired, logging in again...")
        session.post("http://example.com/login", data=login_data)

三、跨域訪問

由於瀏覽器的同源策略限制,如果一個Web頁面中的JavaScript代碼試圖訪問不屬於本域名下的資源時,則會返回401錯誤碼。這通常是因為跨域訪問沒有經過允許而發生的,用戶可能會因此遭受跨站點攻擊。

為了解決跨域訪問問題,可以在服務器上設置響應頭,允許跨域的訪問。以下代碼示例展示如何在服務器端使用Flask框架來實現訪問不同域的資源。

from flask import Flask, jsonify, request
from flask_cors import CORS, cross_origin

app = Flask(__name__)
CORS(app)

@app.route("/")
def index():
    return jsonify({"message": "Hello World!"})

if __name__ == "__main__":
    app.run()

四、訪問授權

有些資源可能需要授予特定的用戶或用戶組才能夠訪問,而服務器會在請求中檢查用戶的訪問權限。如果用戶沒有合適的權限,則會返回401錯誤碼。

以下代碼示例中,服務器使用Flask-JWT-Extended庫來檢查請求。只有當請求包含正確的Token且用戶有訪問此資源的權限時,才會返回請求數據。

from flask import Flask, jsonify
from flask_jwt_extended import get_jwt_identity, jwt_required, JWTManager

app = Flask(__name__)
app.config["JWT_SECRET_KEY"] = "super-secret-jwt-key"
jwt = JWTManager(app)

@app.route("/")
@jwt_required
def index():
    current_user = get_jwt_identity()
    if current_user and current_user["type"] == "admin":
        return jsonify({"message": "Welcome to the admin panel!"}), 200
    else:
        return jsonify({"message": "You are not authorized to access this resource."}), 401

if __name__ == "__main__":
    app.run()

原創文章,作者:YMTJA,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331111.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YMTJA的頭像YMTJA
上一篇 2025-01-16 15:47
下一篇 2025-01-16 15:47

相關推薦

  • 為什麼要加請求頭(HTTP Header)?

    在進行網頁抓取(Web Scraping)時,請求頭(HTTP Header)扮演着非常重要的角色。請求頭中包含了用戶代理(User Agent)、cookie、referer等信…

    編程 2025-04-27
  • HTTP請求方式的選擇:POST還是GET?

    對於使用xxl-job進行任務調度的開發者,通常需要發送HTTP請求來執行一些任務。但是在發送請求時,我們總是會遇到一個問題:是使用POST還是GET?下面將從多個方面對這個問題進…

    編程 2025-04-27
  • 如何快速發佈http接口

    想要快速發佈http接口,可以從以下幾個方面入手。 一、選擇合適的框架 選擇合適的框架對於快速發佈http接口非常重要。目前比較受歡迎的框架有Flask、Django、Tornad…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論