作為一名廣泛使用 API 的高級開發人員,安全性和效率始終是重中之重。在保護 REST API 方面,有多種身份驗證方法可用,但並非所有方法都是相同的。
Atlassian 的 ASAP(服務和專案驗證)Auth 是一個強大、可擴展且安全的選項,特別是在處理需要強大身份驗證機制的微服務或 API 時。但在深入探討為什麼 ASAP 是一個不錯的選擇之前,讓我們先快速了解一下 REST API 是什麼以及它們為何重要。
REST(表達性狀態傳輸)API 是一組規則,允許建立輕量級、可維護且可擴充的 Web 服務。它們遵循無狀態的客戶端-伺服器架構,其中伺服器處理客戶端的請求並發迴回應,通常採用 JSON 或 XML 格式。 REST API 因其簡單性、可擴展性以及將用戶介面與伺服器分離的能力而被廣泛使用,這使得它們非常適合構建可由各種客戶端訪問的Web 服務,包括Web 瀏覽器、行動裝置設備和其他伺服器。
ASAP(服務和專案驗證)是 Atlassian 開發的基於令牌的身份驗證機制。它專為服務到服務通訊而設計,其中一個服務需要安全地呼叫另一個服務。 ASAP 不依賴使用者憑證或 OAuth(更以使用者為中心),而是使用 JWT(JSON Web 令牌)授予對服務的臨時存取權限。這在微服務架構中特別有用,其中服務需要有效地對請求進行身份驗證和授權,而無需管理使用者會話或憑證的開銷。
現在我們了解了 ASAP Auth 的基礎知識,讓我們看看如何用各種程式語言實作它。
import jwt import requests from datetime import datetime, timedelta import os # Define ASAP token creation function def create_asap_token(issuer, audience, private_key): current_time = datetime.utcnow() payload = { 'iss': issuer, 'aud': audience, 'iat': current_time, 'exp': current_time + timedelta(minutes=5), } token = jwt.encode(payload, private_key, algorithm='RS256') return token # Load private key from environment variable or file private_key = os.getenv('PRIVATE_KEY') if not private_key: with open('path_to_private_key.pem', 'r') as key_file: private_key = key_file.read() issuer = 'your-service' audience = 'target-service' token = create_asap_token(issuer, audience, private_key) if isinstance(token, bytes): token = token.decode('utf-8') headers = { 'Authorization': f'Bearer {token}' } try: response = requests.get('https://api.target-service.com/data', headers=headers) response.raise_for_status() # Raises HTTPError for bad responses print(response.json()) except requests.exceptions.RequestException as e: print(f"Request failed: {e}")
import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import java.time.Instant; import java.util.Date; public class ASAPAuthExample { public static PrivateKey loadPrivateKey(String filename) throws Exception { String key = new String(Files.readAllBytes(Paths.get(filename))) .replace("-----BEGIN PRIVATE KEY-----", "") .replace("-----END PRIVATE KEY-----", "") .replaceAll("\s", ""); byte[] keyBytes = java.util.Base64.getDecoder().decode(key); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(spec); } public static String createASAPToken(String issuer, String audience, PrivateKey privateKey) { Algorithm algorithm = Algorithm.RSA256(null, privateKey); Instant now = Instant.now(); return JWT.create() .withIssuer(issuer) .withAudience(audience) .withIssuedAt(Date.from(now)) .withExpiresAt(Date.from(now.plusSeconds(300))) // 5 minutes expiry .sign(algorithm); } public static void main(String[] args) { try { String issuer = "your-service"; String audience = "target-service"; PrivateKey privateKey = loadPrivateKey("path_to_private_key.pem"); String token = createASAPToken(issuer, audience, privateKey); // Use the token to make a secure API request (using your preferred HTTP client) System.out.println("Generated Token: " + token); } catch (Exception e) { System.err.println("Error creating token: " + e.getMessage()); } } }
package main import ( "fmt" "io/ioutil" "time" "github.com/golang-jwt/jwt" ) func loadPrivateKey(path string) (*rsa.PrivateKey, error) { keyData, err := ioutil.ReadFile(path) if err != nil { return nil, err } return jwt.ParseRSAPrivateKeyFromPEM(keyData) } func createASAPToken(issuer, audience, privateKeyPath string) (string, error) { privateKey, err := loadPrivateKey(privateKeyPath) if err != nil { return "", err } token := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims{ "iss": issuer, "aud": audience, "iat": time.Now().Unix(), "exp": time.Now().Add(5 * time.Minute).Unix(), }) tokenString, err := token.SignedString(privateKey) if err != nil { return "", err } return tokenString, nil } func main() { issuer := "your-service" audience := "target-service" privateKeyPath := "path_to_private_key.pem" token, err := createASAPToken(issuer, audience, privateKeyPath) if err != nil { fmt.Println("Error creating token:", err) return } // Use the token to make a secure API request (using your preferred HTTP client) fmt.Println("Generated Token:", token) }
測試 ASAP 驗證需要可以傳送帶有自訂標頭的 HTTP 請求的工具。以下是使用 EchoAPI 和 cURL 的方法。
選擇API方法與網址:
選擇正確的 HTTP 方法(例如 POST、GET)並輸入 API 端點 URL。
導覽至「驗證」標籤:
按一下請求面板中的“身份驗證”標籤。
選擇盡快(Atlassian)驗證:
從類型下拉清單中,選擇 ASAP (Atlassian)。
配置演算法與欄位:
儲存並發送:
按一下“儲存”,然後按一下“傳送”以使用 ASAP 驗證執行請求
curl -X GET "https://api.target-service.com/data" \ -H "Authorization: Bearer <your-asap-token>"
此命令發送 ASAP 令牌作為 HTTP 標頭的一部分,您可以直接在終端機中檢查回應。
ASAP Auth 提供了一種強大、可擴展且安全的方式來處理服務間通訊中的身份驗證,尤其是在微服務架構中。透過利用 JWT,ASAP 可以實現無狀態、基於令牌的身份驗證,這對於維持高安全性和效能至關重要。無論您使用 Python、Java 還是 Go,實施 ASAP Auth 都很簡單,並且可以很好地整合到現有工作流程中。
此外,使用 EchoAPI 或 cURL 等工具測試此驗證方法可確保您的實作安全且正常運作。當您繼續建置和保護 REST API 時,請考慮使用 ASAP Auth 來增強整個服務的安全性和效率。
以上是為什麼 ASAP (Atlassian) Auth 是 REST API 驗證的快速且安全的選擇?的詳細內容。更多資訊請關注PHP中文網其他相關文章!