一、請求頭與身份認證
在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-tw/n/331111.html