0Pricing
AI Agents · บทเรียน

การยืนยันตัวตน: คีย์ API และ OAuth

โทเค็นผู้ถือ ส่วนหัวคีย์ API และโฟลว์ OAuth2 สำหรับเข้าถึง API ของตัวแทน

การยืนยันตัวตน: คีย์ API และ OAuth เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการยืนยันตัวตนจึงสำคัญสำหรับเอเจนต์

เมื่อเอเจนต์เรียกใช้ API ภายนอก เซิร์ฟเวอร์จำเป็นต้องรู้ว่าใครเป็นผู้ส่งคำขอ การยืนยันตัวตนใช้พิสูจน์ว่าเป็นใคร ส่วน การอนุญาตสิทธิ์ใช้กำหนดว่าทำอะไรได้บ้าง หากไม่มีการยืนยันตัวตนและการอนุญาตสิทธิ์ที่เหมาะสม ทุกคำขอจะส่งคืน 401 Unauthorized และเอเจนต์ของคุณจะทำอะไรไม่ได้

รูปแบบหลักสองแบบที่ใช้กันมากในการพัฒนาเอเจนต์คือ คีย์ API และ OAuth 2.0

import requests

# Without auth — will get 401
response = requests.get('https://api.openai.com/v1/models')
print(response.status_code)  # 401 Unauthorized

# With API key in header — works
headers = {'Authorization': 'Bearer sk-proj-abc123'}
response = requests.get(
    'https://api.openai.com/v1/models',
    headers=headers
)
print(response.status_code)  # 200

คีย์ API ในส่วนหัว Authorization

รูปแบบที่ใช้กันมากที่สุดคือการส่งคีย์ API ในส่วนหัว Authorization ในรูปแบบ โทเค็น Bearer คำว่า "Bearer" เป็นสัญญาณว่าผู้ใดก็ตามที่มีโทเค็นนี้ได้รับอนุญาต เพราะเซิร์ฟเวอร์เชื่อถือผู้ถือคีย์

รูปแบบนี้ใช้โดย OpenAI, Anthropic, GitHub และ API สมัยใหม่ส่วนใหญ่

import requests
import os

api_key = os.environ['OPENAI_API_KEY']

response = requests.post(
    'https://api.openai.com/v1/chat/completions',
    headers={
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json'
    },
    json={
        'model': 'gpt-4o-mini',
        'messages': [{'role': 'user', 'content': 'Hello!'}]
    }
)
print(response.json()['choices'][0]['message']['content'])

คีย์ API ในส่วนหัวแบบกำหนดเอง (X-API-Key)

API บางแห่ง โดยเฉพาะ API รุ่นเก่าหรือ API ภายใน ใช้ส่วนหัวแบบกำหนดเอง เช่น X-API-Key แทน Authorization: Bearer รูปแบบการใช้งานเหมือนกัน เพียงแต่ใช้ชื่อส่วนหัวต่างกัน โปรดตรวจสอบเอกสาร API เพื่อดูชื่อส่วนหัวที่ต้องใช้ให้ถูกต้องเสมอ

import requests
import os

api_key = os.environ['SERVICE_API_KEY']

response = requests.get(
    'https://api.someservice.com/v1/data',
    headers={
        'X-API-Key': api_key,
        'Accept': 'application/json'
    }
)

if response.status_code == 200:
    data = response.json()
    print('Got data:', data)
elif response.status_code == 401:
    print('Invalid API key — check X-API-Key header')

การจัดเก็บข้อมูลรับรองในตัวแปรสภาพแวดล้อม

อย่าเขียนคีย์ API ลงในซอร์สโค้ดโดยตรง หากคุณส่งคีย์ขึ้นคลังโค้ดสาธารณะ บอตจะค้นพบและนำไปใช้ในทางที่ผิดภายในไม่กี่วินาที วิธีที่ถูกต้องคือจัดเก็บข้อมูลรับรองไว้ใน ตัวแปรสภาพแวดล้อม และอ่านค่าเมื่อทำงานด้วย os.environ

ใช้ os.environ.get() พร้อมข้อความแสดงข้อผิดพลาดที่ชัดเจนเมื่อไม่มีคีย์

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789'  # simulate a set env var

api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
    raise EnvironmentError(
        'OPENAI_API_KEY environment variable not set. '
        'Run: export OPENAI_API_KEY=your-key-here'
    )

print('API key loaded from environment (never hard-code it in source)')

การใช้ python-dotenv สำหรับการพัฒนาในเครื่อง

ระหว่างการพัฒนา ให้เก็บคีย์ไว้ในไฟล์ .env ที่โฟลเดอร์รากของโครงการ ใช้ไลบรารี python-dotenv เพื่อโหลดคีย์โดยอัตโนมัติ เพิ่ม .env ลงใน .gitignore เพื่อป้องกันไม่ให้ไฟล์นี้ถูกส่งขึ้นคลังโค้ด

# .env file (never commit this!)
# OPENAI_API_KEY=sk-proj-abc123
# ANTHROPIC_API_KEY=sk-ant-xyz456
# GITHUB_TOKEN=ghp_abc789

# In your Python code:
from dotenv import load_dotenv
import os

load_dotenv()  # loads .env into os.environ

openai_key = os.environ['OPENAI_API_KEY']
anthropic_key = os.environ['ANTHROPIC_API_KEY']
github_token = os.environ['GITHUB_TOKEN']

print('Keys loaded successfully')

OAuth 2.0 คืออะไร

OAuth 2.0 เป็นมาตรฐานสำหรับการอนุญาตสิทธิ์แบบมอบหมาย แทนที่จะให้รหัสผ่านของผู้ใช้แก่เอเจนต์ OAuth เปิดโอกาสให้ผู้ใช้ อนุญาต เอเจนต์ของคุณให้ดำเนินการแทน โดยจำกัดขอบเขตและช่วงเวลาไว้ รูปแบบนี้ใช้โดย Google, GitHub, Slack และ Salesforce

แนวคิดสำคัญคือ หลังจากผ่านขั้นตอนการอนุญาตสิทธิ์แล้ว เอเจนต์จะได้รับ โทเค็นการเข้าถึง จากนั้นจึงใช้โทเค็นดังกล่าวเรียก API

# OAuth flow overview:
#
# 1. Agent redirects user to:
#    https://auth.provider.com/oauth/authorize
#      ?client_id=YOUR_CLIENT_ID
#      &redirect_uri=http://localhost:8080/callback
#      &scope=read:repo%20write:issues
#      &response_type=code
#
# 2. User logs in and grants permission
# 3. Provider redirects to your callback with ?code=AUTH_CODE
# 4. Agent exchanges code for access_token
# 5. Agent uses access_token for API calls

print('OAuth flow: authorize -> code -> token -> API calls')

โฟลว์ข้อมูลรับรองไคลเอ็นต์ OAuth2

โฟลว์ข้อมูลรับรองไคลเอ็นต์ เป็นโฟลว์ OAuth ที่เรียบง่ายที่สุดสำหรับเอเจนต์ โดยไม่ต้องมีการโต้ตอบกับผู้ใช้ เอเจนต์ของคุณจะยืนยันตัวตนด้วยรหัสไคลเอ็นต์และข้อมูลลับของตัวเองเพื่อรับโทเค็น วิธีนี้ใช้สำหรับการสื่อสารระหว่างเครื่องกับเครื่อง (M2M)

คุณส่งข้อมูลรับรองด้วย POST ไปยังจุดปลายทางโทเค็น และได้รับโทเค็นการเข้าถึงที่มีอายุสั้น

import requests
import os

client_id = os.environ['OAUTH_CLIENT_ID']
client_secret = os.environ['OAUTH_CLIENT_SECRET']
token_url = 'https://auth.example.com/oauth/token'

# Request an access token
response = requests.post(token_url, data={
    'grant_type': 'client_credentials',
    'client_id': client_id,
    'client_secret': client_secret,
    'scope': 'read:data write:tasks'
})

token_data = response.json()
access_token = token_data['access_token']
expires_in = token_data['expires_in']  # seconds
print(f'Token valid for {expires_in}s')

การใช้โทเค็น OAuth ในการเรียก API

เมื่อมีโทเค็นการเข้าถึง OAuth แล้ว ให้ใช้เหมือนคีย์ API ทุกประการ โดยใส่ไว้ในส่วนหัว Authorization: Bearer ความแตกต่างคือโทเค็น OAuth หมดอายุ ดังนั้นเอเจนต์ของคุณต้องจัดการการต่ออายุโทเค็นก่อนทำการเรียก

import requests
import os
import time

class OAuthClient:
    def __init__(self, client_id, client_secret, token_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.token_url = token_url
        self.access_token = None
        self.token_expiry = 0

    def get_token(self):
        if time.time() < self.token_expiry - 60:  # 60s buffer
            return self.access_token
        r = requests.post(self.token_url, data={
            'grant_type': 'client_credentials',
            'client_id': self.client_id,
            'client_secret': self.client_secret
        })
        data = r.json()
        self.access_token = data['access_token']
        self.token_expiry = time.time() + data['expires_in']
        return self.access_token

    def get(self, url):
        token = self.get_token()
        return requests.get(url, headers={'Authorization': f'Bearer {token}'})

OAuth 2.0 ด้วยไลบรารี google-auth

สำหรับ API ของ Google ไลบรารี google-auth จัดการความซับซ้อนทั้งหมดของ OAuth ให้คุณ ไลบรารีนี้จัดการต่ออายุโทเค็นโดยอัตโนมัติ อ่านข้อมูลรับรองจากไฟล์ JSON และแนบโทเค็นไปกับคำขอผ่าน AuthorizedSession

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

# Load service account credentials from JSON file
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json',
    scopes=[
        'https://www.googleapis.com/auth/gmail.readonly',
        'https://www.googleapis.com/auth/calendar.events'
    ]
)

# AuthorizedSession auto-refreshes tokens
session = AuthorizedSession(credentials)

response = session.get(
    'https://www.googleapis.com/gmail/v1/users/me/messages'
)
print(response.json())

แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยของคีย์ API

การปกป้องคีย์ API มีความสำคัญอย่างยิ่งต่อความปลอดภัยของเอเจนต์ โปรดปฏิบัติตามกฎเหล่านี้:

  • เก็บคีย์ไว้ในตัวแปรสภาพแวดล้อมหรือตัวจัดการข้อมูลลับ (AWS Secrets Manager, HashiCorp Vault)
  • อย่าบันทึกคีย์ลงในบันทึก — ให้ปกปิดคีย์ในผลลัพธ์
  • หมุนเวียนคีย์เป็นประจำ และเพิกถอนคีย์ที่ถูกบุกรุกทันที
  • ใช้หลักสิทธิ์น้อยที่สุด — ขอเฉพาะขอบเขตที่เอเจนต์จำเป็นต้องใช้
  • กำหนดรายการอนุญาต IP ให้กับคีย์ API เมื่อผู้ให้บริการรองรับ
import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789'

def get_key(env_var):
    key = os.environ.get(env_var)
    if not key:
        raise EnvironmentError(f'Missing required env var: {env_var}')
    return key

def mask_key(key):
    if len(key) < 8:
        return '***'
    return key[:4] + '...' + key[-4:]

api_key = get_key('OPENAI_API_KEY')
print(f'Using key: {mask_key(api_key)}')

การจัดการ 401 ไม่ได้รับอนุญาตในเอเจนต์ของคุณ

เมื่อเอเจนต์ได้รับการตอบกลับ 401 Unauthorized จะต้องไม่ลองใหม่โดยไม่ตรวจสอบ — การทำเช่นนั้นสิ้นเปลืองโควตาการจำกัดอัตรา แต่ให้ตรวจสอบว่าโทเค็นหมดอายุหรือไม่ (ลองต่ออายุ) หรือคีย์ไม่ถูกต้องหรือไม่ (แจ้งเตือนทันทีเพื่อให้มนุษย์แก้ไขได้)

import requests
import os

def call_api_with_auth_check(url, api_key):
    response = requests.get(
        url,
        headers={'Authorization': f'Bearer {api_key}'}
    )
    if response.status_code == 401:
        error = response.json().get('error', {})
        code = error.get('code', 'unknown')
        if code == 'token_expired':
            print('Token expired — refresh needed')
            # trigger token refresh flow
        else:
            raise PermissionError(
                f'API key rejected: {error.get("message", "401 Unauthorized")}'
            )
    response.raise_for_status()
    return response.json()

ตรวจสอบความเข้าใจอย่างรวดเร็ว: การจัดเก็บคีย์ API

ทดสอบความเข้าใจเกี่ยวกับการจัดการข้อมูลรับรอง

สรุปการยืนยันตัวตน

คุณได้เรียนรู้รูปแบบการยืนยันตัวตนหลักสำหรับเอเจนต์แล้ว:

  • คีย์ API — ส่งผ่านส่วนหัว Authorization: Bearer TOKEN หรือ X-API-Key ซึ่งเรียบง่ายและไม่มีสถานะ
  • OAuth 2.0 — โฟลว์ข้อมูลรับรองไคลเอ็นต์สำหรับ M2M โทเค็นหมดอายุและต้องต่ออายุ
  • เก็บคีย์ไว้ใน ตัวแปรสภาพแวดล้อม เสมอ อย่าเก็บไว้ในซอร์สโค้ด
  • ใช้ python-dotenv ในเครื่อง และใช้ตัวแปรสภาพแวดล้อมหรือตัวจัดการข้อมูลลับในระบบใช้งานจริง
  • จัดการ การตอบกลับ 401 โดยตรวจสอบว่าโทเค็นหมดอายุหรือคีย์ไม่ถูกต้อง

การจัดการการยืนยันตัวตนที่รัดกุมเป็นรากฐานของเอเจนต์ที่เชื่อถือได้ทุกตัว

คำถามที่พบบ่อย

บทเรียน “การยืนยันตัวตน: คีย์ API และ OAuth” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การยืนยันตัวตน: คีย์ API และ OAuth” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การยืนยันตัวตน: คีย์ API และ OAuth”

โทเค็นผู้ถือ ส่วนหัวคีย์ API และโฟลว์ OAuth2 สำหรับเข้าถึง API ของตัวแทน คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การยืนยันตัวตน: คีย์ API และ OAuth” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน REST API สำหรับนักพัฒนาตัวแทน
  2. การยืนยันตัวตน: คีย์ API และ OAuth
  3. การจัดการการตอบกลับและข้อผิดพลาดของ API
  4. การจำกัดอัตราและตรรกะการลองใหม่
← กลับไปที่ AI Agents