Для старшего разработчика, который активно работает с API, безопасность и эффективность всегда являются главными приоритетами. Когда дело доходит до защиты REST API, существует множество методов аутентификации, но не все они одинаковы.
Atlassian ASAP (Аутентификация для сервисов и проектов) Auth выделяется как надежный, масштабируемый и безопасный вариант, особенно при работе с микросервисами или API, требующими надежных механизмов аутентификации. Но прежде чем углубляться в то, почему ASAP — такой отличный выбор, давайте кратко рассмотрим, что такое REST API и почему они важны.
REST API (передача репрезентативного состояния) — это набор правил, которые позволяют создавать легкие, удобные в обслуживании и масштабируемые веб-сервисы. Они следуют архитектуре клиент-сервер без сохранения состояния, в которой сервер обрабатывает запрос клиента и отправляет ответ, обычно в формате JSON или XML. REST API широко используются из-за их простоты, масштабируемости и возможности отделить пользовательский интерфейс от сервера, что делает их идеальными для создания веб-сервисов, к которым могут получить доступ различные клиенты, включая веб-браузеры, мобильные устройства и другие серверы.
ASAP (Аутентификация для сервисов и проектов) — это механизм аутентификации на основе токенов, разработанный Atlassian. Он разработан специально для связи между службами, когда одной службе необходимо безопасно вызывать другую. Вместо того, чтобы полагаться на учетные данные пользователя или OAuth (который более ориентирован на пользователя), ASAP использует JWT (веб-токены JSON) для предоставления временного доступа к сервисам. Это особенно полезно в микросервисных архитектурах, где службам необходимо эффективно аутентифицировать и авторизовать запросы без накладных расходов на управление сеансами пользователей или учетными данными.
Теперь, когда мы понимаем основы 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 и URL:
Выберите правильный метод HTTP (например, POST, GET) и введите URL-адрес конечной точки API.
Перейдите на вкладку «Аутентификация»:
Нажмите вкладку «Аутентификация» на панели запросов.
Выберите авторизацию ASAP (Atlassian):
В раскрывающемся списке «Тип» выберите «Как можно скорее (Atlassian)».
Настройте алгоритм и поля:
Сохранить и отправить:
Нажмите «Сохранить», затем «Отправить», чтобы выполнить запрос с аутентификацией ASAP
curl -X GET "https://api.target-service.com/data" \ -H "Authorization: Bearer"
Эта команда отправляет токен ASAP как часть заголовка HTTP, и вы можете проверить ответ непосредственно в терминале.
ASAP Auth обеспечивает надежный, масштабируемый и безопасный способ аутентификации при взаимодействии между службами, особенно в микросервисных архитектурах. Используя JWT, ASAP обеспечивает аутентификацию на основе токенов без сохранения состояния, что имеет решающее значение для поддержания высокого уровня безопасности и производительности. Независимо от того, работаете ли вы с Python, Java или Go, реализация ASAP Auth проста и хорошо интегрируется в существующие рабочие процессы.
Кроме того, тестирование этого метода аутентификации с использованием таких инструментов, как EchoAPI или cURL, гарантирует, что ваша реализация безопасна и работает правильно. Продолжая создавать и защищать свои REST API, рассмотрите возможность использования ASAP Auth для повышения безопасности и эффективности ваших сервисов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3