API 授權最佳實踐

API(應用程序編程接口)就像秘密之門,允許不同的軟件程序進行通信。但并不是每個人都應該擁有每扇門的鑰匙,就像不是每個軟件都應該不受限制地訪問每個 API 一樣。

這些 API 將從銀行的移動應用程序到您最喜歡的社交媒體平臺的所有內容連接起來,處理敏感數據并執行關鍵功能。

如果沒有嚴格的授權協議,應用程序接口可能會被濫用,導致數據泄露、服務中斷和用戶信任度下降。

因此,這就是 API 授權發揮作用的地方。

API 授權就像一個守門員,確保只有擁有正確鑰匙的正確軟件才能打開大門,使用里面的資源。有效的 API 授權不僅僅是安全問題,它還能創造無縫、安全的用戶體驗。它確保授權應用程序只能訪問個人信息,并且這些應用程序只能在其允許的范圍內執行操作。

了解API授權

在討論 API 授權最佳實踐之前,我們必須了解兩個經常被混淆的概念之間的區別:授權和驗證。

身份驗證就是驗證身份。就像通過用戶名、密碼或生物識別技術確認用戶身份一樣。

授權則是在身份得到確認后,授予對資源或功能的訪問權限。例如,如果身份驗證是為了通過前門,那么授權則決定了用戶可以訪問大樓內的哪些房間和服務。

API授權最佳實踐

既然您現在了解了 API 授權的重要性,那就讓我們深入探討一下如何充分利用它的最佳實踐吧。

1.使用基于令牌的授權(JWT、OAuth 令牌)

基于令牌的授權,尤其是?JWT(JSON Web 令牌)和 OAuth 令牌,為管理 API 交互提供了一種安全高效的方式。例如

  • 令牌支持無狀態身份驗證,這意味著服務器不需要為每個用戶維護會話狀態,從而實現更好的可擴展性。
  • 令牌可以通過各種方式安全傳輸,并且比傳統的基于會話的身份驗證更不易受到 CSRF 攻擊。
  • 令牌可以跨域使用,這使其成為微服務架構和單點登錄?(SSO) 應用程序的理想選擇。
  • 令牌(尤其是 OAuth 令牌)可以包含范圍和權限,從而提供對經過身份驗證的用戶操作的精確控制。

如何使用 JWT 實現基于令牌的授權

JWT 通常在用戶成功驗證后生成。它們包含一個包含用戶信息和可能的權限的有效載荷。您可以使用 Node.js 中的 jsonwebtoken 或 Python 中的 PyJWT 等庫實現 JWT 授權。

首先,您需要生成 JWT 標記。下面是使用 PyJWT 的方法:

import jwtfrom datetime import datetime, timedeltasecret_key = 'YOUR_SECRET_KEY'payload = {    'sub': user_id,    'iat': datetime.utcnow(),    'exp': datetime.utcnow() + timedelta(days=1)}token = jwt.encode(payload, secret_key, algorithm='HS256')

然后,需要對每個請求進行驗證,以確定用戶是否被允許執行請求。令牌通常會在每個請求的授權頭中發送。服務器可以使用秘鑰解碼 JWT 并進行驗證。如果有效,服務器就會處理請求;如果無效,服務器就會返回錯誤信息。

from flask import Flask, request, jsonifyimport jwtimport datetimeapp = Flask(name)SECRET_KEY = "your_secret_key"  # Replace with your secret keySample route that requires token-based authorization@app.route('/protected', methods=['GET'])def protected():    token = request.headers.get('Authorization')    if not token:        return jsonify({'message': 'Token is missing!'}), 403    try:        # Decoding the token        data = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])        # You can use the data in the token as needed, for example:        # user_id = data['user_id']    except jwt.ExpiredSignatureError:        return jsonify({'message': 'Token has expired!'}), 403    except jwt.InvalidTokenError:        return jsonify({'message': 'Invalid token!'}), 403    # Token is valid, process the request    return jsonify({'message': 'Token is valid! You have access to protected routes.'})

2.實施細粒度訪問控制

細粒度訪問控制是一種安全管理方法,可對應用程序的權限和訪問權進行詳細控制。它能確保用戶或服務只擁有所需的訪問權限,并遵循最小特權原則。

如何實施細粒度訪問控制:

實施精細度訪問控制涉及幾個步驟:

  • 定義角色和權限:識別系統中不同的用戶角色并定義每個角色的具體操作。
  • 使用基于角色的訪問控制 (RBAC):實施 RBAC,根據角色授予資源訪問權限。每個角色都被分配了特定的權限。
  • 考慮基于屬性的訪問控制 (ABAC):對于更復雜的場景,可以使用 ABAC,其中訪問決策基于屬性(用戶、資源、環境)的組合。

例如,如果您有一個 API,其中管理員用戶的訪問權限不同。您可以使用可在應用程序中重復使用的獨立組件來實現訪問控制機制。

您所要做的就是:

首先,創建一個名為 “authorizer “的 Node.js 組件,讓您可以使用命令來實現驗證邏輯:

bit create node util/authorizer

如果操作正確,就會看到輸出結果:

接下來,實現授權邏輯:

export function authorizer(userId: string) { // Implement logic to retrieve the user's role if (userId === 'U001') {   return "admin"; } return "customer"}

接下來,使用命令創建一個 Express App:

bit create express-app api

您將看到輸出結果:

接下來,讓我們通過更新 mock-route.ts 將授權器連接到應用程序。一開始,你會看到這樣的內容

讓我們添加一個新的中間件:

這將確保您的授權器組件在調用實際業務邏輯之前運行。運行 API 后,您應該會看到以下輸出:

通過函數鏈,我們實現了基于角色的訪問控制。裝飾器會檢查用戶的角色是否符合端點所需的角色。如果不匹配,則返回拒絕訪問消息。

當你不斷更新授權邏輯和更新應用程序時,比特的 CI 服務器–Ripple CI 會自動更新整個樹中的更改。

3. 安全API網關配置

API 網關是所有 API 請求的前門,為執行安全和操作策略提供了一個集中的場所。例如,API 網關可幫助您實現以下功能

  • 增強的安全性:提供額外的安全層,防止 DDoS 攻擊、未經授權的訪問和 API 濫用等威脅。
  • 速率限制和節流:防止 API 過度使用并確保用戶之間的公平使用。
  • 數據轉換和驗證:確保傳入數據符合預期的格式和標準。

如何實施安全 API 網關配置:

您可以為自己的應用程序選擇多種 API Gateway 提供商。例如,亞馬遜 API Gateway、Kong 和谷歌 Apigee 都是最受歡迎的 API Gateway 平臺。

如果您計劃使用 AWS,可以按照其文檔中的步驟輕松創建 API 網關。不過,您還需要啟用一些額外的功能,以確保 API 網關的安全和高效。

  • 設置速率限制— 在 AWS 管理控制臺中,導航到 Amazon API Gateway,選擇您的 API,然后轉到保護選項卡下的限制部分。在那里,您可以設置速率和突發限制。

  • 啟用?SSL/TLS?— 確保 API Gateway 的自定義域名與 AWS Certificate Manager 中的 SSL/TLS 證書關聯。
  • 實施?IP?限制— 使用 AWS Lambda 授權方驗證傳入請求的 IP 地址。部署該功能后,您可以通過在授權選項卡中為 API 網關創建新的授權者來選擇該功能。以下是 Python 中用于限制 IP 的示例 Lambda 函數:
import jsondef lambda_handler(event, context):    ip_address = event['requestContext']['identity']['sourceIp']    allowed_ips = ['192.168.1.1']  # List of allowed IPs    # Add logic here to check if the ip_address is in allowed_ips or not    if ip_address not in allowed_ips:        raise Exception('Unauthorized')    return {        'principalId': 'user',        'policyDocument': {            'Version': '2012-10-17',            'Statement': [{                'Action': 'execute-api:Invoke',                'Effect': 'Allow',                'Resource': event['methodArn']            }]        }    }
  • 啟用?CloudWatch Logs?— 在 AWS 管理控制臺中,轉到 API 網關的設置。在CloudWatch?設置部分中,選中啟用CloudWatch Log選項。將日志級別設置為INFO以記錄所有請求和響應,或將日志級別設置為ERROR以僅記錄錯誤響應。

4. 加密傳輸中和靜態的敏感數據

對傳輸中和靜態的敏感數據進行加密是保護數據免遭未經授權的訪問和泄露的基本安全實踐。傳輸中加密可保護數據在客戶端和服務器之間移動時的安全,而靜態加密則可保護存儲在磁盤或數據庫上的數據。

如何在傳輸中實施加密

如果使用自己的網絡服務器,則必須手動設置和管理 SSL/TLS 證書。首先,需要從可信的證書頒發機構(CA)獲取證書,如 Let’s Encrypt、DigiCert、GoDaddy 等。然后,配置服務器以使用 CA。例如,下面是如何使用 Nginx 配置 SSL:

  • 修改 Nginx 配置文件(通常位于/etc/nginx/nginx.conf或/etc/nginx/sites-available/your_site)。
  • 在服務器塊中添加 SSL 設置:
server {    listen 443 ssl;    server_name yourdomain.com;    ssl_certificate /path/to/your/fullchain.pem; # Path to your fullchain.pem from CA    ssl_certificate_key /path/to/your/privkey.pem; # Path to your private key from CA    # Strong encryption settings (consider using recommendations from Mozilla's SSL Configuration Generator)    ssl_protocols TLSv1.2 TLSv1.3;    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';        # Other server configurations...}

如果你使用的是云服務,它們會為處理 SSL/TLS 提供完全托管的服務。例如,您可以使用 AWS 證書管理器來管理 AWS 托管的服務。

如何實施靜態加密

您可以在數據庫級別、應用程序級別或使用基于云的工具實施靜態加密。

  • 數據庫級加密:許多現代數據庫提供內置加密功能。例如:
  • SQL Server:透明數據加密。
  • MySQL:InnoDB 表空間加密。
  • MongoDB:加密存儲引擎。
  • 應用程序級加密:應用程序級加密應用于高敏感數據,甚至在存儲到數據庫之前對其進行加密。您可以使用密碼學等庫來實現此目的:
from cryptography.fernet import Fernet# Generate a keykey = Fernet.generate_key()cipher_suite = Fernet(key)# Encrypt dataencrypted_data = cipher_suite.encrypt(b"Sensitive Data")# Decrypt datadecrypted_data = cipher_suite.decrypt(encrypted_data)

最后的想法

強大的應用程序接口授權對于確保數字資產安全和維護用戶信任至關重要。

通過實施本文討論的最佳實踐,開發人員可以顯著增強應用程序的 API 安全性,同時確保合規性并防范各種網絡威脅。

原文鏈接:Best-Practices for API Authorization

編譯:冪簡集成

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38145.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

英語中Would you和Could you的區分用法

Spark: 在英語中,“Would you”和“Could you”都是用來禮貌地提出請求或詢問的表達方式,但它們之間存在一定的差異: 語氣與禮貌程度: Would you:通常用于更正式或較為禮貌的場合,它體現了一種比較客氣的請…

打開wsl顯示請啟用虛擬機平臺 Windows 功能并確保在 BIOS 中啟用虛擬化。

安裝了個安卓模擬器,后面wsl打開后顯示這個 按照很多博客說的運行一串命令 bcdedit /set hypervisorlaunchtype auto 之后重啟電腦 沒有效果 運行 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 之后重啟成功打開 wsl 來…

某智能裝備公司如何實現多個工程師共用1臺圖形工作站

在當今快速發展的科技領域,資源共享和高效利用已成為企業提升競爭力的關鍵,特別是在工程設計和研發領域。如何最大化地利用有限的資源,如工作站,成為了許多公司面臨的挑戰。某智能裝備公司便是在這樣的背景下,通過云飛…

【自動駕駛汽車通訊協議】深入理解PCI Express(PCIe)技術

文章目錄 0. 前言1. PCIe簡介1.1 PCIe外觀1.2 PCIe的技術迭代 2. PCIe的通道(lane)配置2.1 通道配置詳解2.2 通道配置的影響 3. PCIe的架構3.1 架構層次3.2 核心組件 4. PCIe的特性5. PCIe在自動駕駛中的應用 0. 前言 按照國際慣例,首先聲明&…

C# --- 如何在代碼中開啟進程

C# --- 使用代碼開啟一個進程 方法一 using (Process myProcess new Process()) {myProcess.StartInfo.UseShellExecute false;// You can start any process, HelloWorld is a do-nothing example.myProcess.StartInfo.FileName "C:\\HelloWorld.exe";myProcess…

unity canvas顯示相機照射畫面的方法

1. 使用 Image 組件顯示處理后的圖像 如果你的圖像數據已經是一個 Texture2D 或 Sprite,你可以將它直接顯示在Canvas上的 Image 組件中: 創建 Sprite: 將你的 Texture2D 數據轉換為 Sprite,以便可以在 Image 組件中使用。public Sprite CreateSpriteFromTexture(Texture2D…

【產品運營】Saas的核心六大數據

國內頭部軟件公司的一季度表現慘不忍睹,為啥美國的還那么賺錢呢?其實核心是,沒幾個Saas產品經理是看數據的,也不知道看啥數據。 SaaS 行業,天天拋頭露面、名頭叫的響的 SaaS 產品,真沒有幾個賺錢的。 那為…

電子看板,幫助工廠實現數字化管理

在數字化浪潮的推動下,制造業正經歷著深刻的變革,數字工廠成為了行業發展的新趨勢。而生產管理看板作為一種重要的管理工具,在提升數字工廠管理效率方面發揮著關鍵作用。 生產管理看板通過實時數據的展示,為數字工廠提供了清晰的全…

【算法學習】射線法判斷點在多邊形內外(C#)以及確定內外兩點連線與邊界的交點

1.前言: 在GIS開發中,經常會遇到確定一個坐標點是否在一塊區域的內部這一問題。 如果這個問題不是一個單純的數學問題,例如:在判斷DEM、二維圖像像素點、3D點云點等含有自身特征信息的這些點是否在一個區域范圍內部的時候&#x…

基于uniapp(vue3)H5附件上傳組件,可限制文件大小

代碼&#xff1a; <template><view class"upload-file"><text>最多上傳5份附件&#xff0c;需小于50M</text><view class"" click"selectFile">上傳</view></view><view class"list" v…

CCAA:認證通用基礎 10(審核的概念、審核有關的術語、審核的特征、審核原則)

10.審核的概念、審核有關的術語、審核的特征、審核原則 10.1審核的基本概念 第一章 審核基礎知識 第一節 概述 1.什么是審核 審核是認證過程中最基本的活動&#xff0c;是審核方案的重要組成部分&#xff0c;其實施效果直接影響到審核方案的意圖和審核目標的達成。 在認證…

外貿企業選擇什么網絡?

隨著全球化的深入發展&#xff0c;越來越多的國內企業將市場拓展到海外。為了確保外貿業務的順利進行&#xff0c;企業需要建立一個穩定、安全且高速的網絡。那么&#xff0c;外貿企業應該選擇哪種網絡呢&#xff1f;本文將為您詳細介紹。 外貿企業應選擇什么網絡&#xff1f; …

算法訓練(leetcode)第二十三天 | 455. 分發餅干、*376. 擺動序列、53. 最大子數組和

刷題記錄 455. 分發餅干*376. 擺動序列53. 最大子數組和 455. 分發餅干 leetcode題目地址 貪心&#xff0c;兩個數組排序&#xff0c;從前向后或從后向前均可&#xff0c;二者需保持同序&#xff0c;使用兩個指針分別指向兩個數組&#xff0c;當胃口滿足時兩個指針同時后移并…

VehicleSPY的安裝與使用

VehicleSPY介紹 Vehicle Spy 是美國英特佩斯公司的一款集成了診斷、節點/ECU仿真、數據獲取、自動測試和車內通信網絡監控等功能的工具&#xff0c;Vehicle Spy軟件支持的應用場景很多&#xff0c;無法一一列舉&#xff0c;以下是一些常見的應用&#xff1a; 總線監控&#x…

C#中類的反射以及調用小妙招

C#中類的反射以及調用小妙招 介紹原始代碼類的反射修改之后的代碼總結 介紹 最近看到原來同事寫的代碼感嘆了一下&#xff0c;優化這個東西確實是永無止境的&#xff0c;其實就是不了解類的反射和返回值的使用。 原始代碼 public void OnExit(Frame f, QFSMAnimatorEnum sta…

stthjpv:一款針對JWT Payload的安全保護工具

關于stthjpv stthjpv是一款針對JWT Payload的安全保護工具&#xff0c;這款工具集多種技術和思想于一身&#xff0c;可以通過不斷改變相關參數值來防止Payload被解碼&#xff0c;以幫助廣大研究人員更好地保護JWT Payload的安全性。 除此之外&#xff0c;該工具還能夠確保JWT …

如何定制化 ListView 界面

&#x1f604;作者簡介&#xff1a; 小曾同學.com,一個致力于測試開發的博主??&#xff0c;主要職責&#xff1a;測試開發、CI/CD 如果文章知識點有錯誤的地方&#xff0c;還請大家指正&#xff0c;讓我們一起學習&#xff0c;一起進步。 &#x1f60a; 座右銘&#xff1a;不…

代碼查重軟件-自力更生

為了減輕工作量&#xff0c;自研了簡單實用的代碼查重工具&#xff0c;可以對若干文件之間進行查重。通過調試&#xff0c;相似度大于80%的沒有一個是冤枉的。好用。去掉雷同的&#xff0c;其他的代碼再慢慢看。

Python中的除法操作詳解

在Python編程中&#xff0c;除法是一個基礎但極其重要的算術操作。Python提供了多種除法運算方式&#xff0c;以適應不同的計算需求。以下是對Python中除法操作的全面介紹&#xff0c;包括示例代碼。 1. 普通除法 / 普通除法使用/運算符&#xff0c;它返回一個浮點數結果&…

Java UU跑腿同城跑腿小程序源碼快遞代取幫買幫送源碼小程序+H5+公眾號跑腿系統

&#x1f680;【同城生活小助手】&#x1f680; &#x1f3c3;?♂?【同城跑腿&#xff0c;即刻送達的便利生活】&#x1f3c3;?♀? 在快節奏的都市生活中&#xff0c;時間成了最寶貴的資源。UU跑腿小程序&#xff0c;作為同城生活的得力助手&#xff0c;讓你輕松解決生活…