Server-to-Server常用认证方式

API key

放在请求头里,例如

const axios = require('axios');

axios.get('https://api.example.com/users', {
  headers: {
    'x-api-key': 'YOUR_API_KEY'
  }
})
.then(res => console.log(res.data))
.catch(err => console.error(err));

Token(jwt)

先调用登录api来获得token

POST http://localhost:3000/login
Content-Type: application/json

{
  "username": "alice",
  "password": "123456"
}

然后得到相应:

{
  "message": "Login success",
  "token": "eyJhbGciOiJIUzI1NiIsInR..."
}

然后带上这个token在请求头里:


def access_protected_resource(jwt_token):
    url = f"{BASE_URL}/profile"
    headers = {
        "Authorization": f"Bearer {jwt_token}"
    }

    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        print("✅ 成功访问受保护资源:")
        print(response.json())
    else:
        print("❌ 访问失败:", response.status_code, response.text)

OAuth2

1. 用户点击“用 Google 登录”

  • 前端调用 Google 的 OAuth 2.0 授权接口,用户同意授权后,Google 返回一个 ID Token(JWT 格式)给前端。

2. 前端拿到 Google 的 ID Token

  • 这是一个经过 Google 签名的 JWT,里面包含用户的身份信息(邮箱、姓名等)。

3. 前端把 ID Token 传给你的后端 API

  • 比如放在请求头: makefileCopyEditAuthorization: Bearer <Google ID Token> 或者放在请求体里。

4. 你的后端验证这个 Google ID Token

  • 使用 Google 提供的公钥或者官方 SDK 验证签名和合法性。
  • 验证通过后,解析出用户身份信息。

5. 后端根据用户身份生成自己的 JWT(可选)

  • 你可以基于 Google 用户身份,生成自己的 JWT Token,用来后续访问你的服务。
  • 这样你后端就不用每次都去验证 Google 的 ID Token。

6. 后端授权并返回资源

  • 根据身份判断权限,返回用户可访问的数据。

✅ 具体技术细节

验证 Google ID Token

你可以使用 Google 官方库验证,比如 Python:

from google.oauth2 import id_token
from google.auth.transport import requests

def verify_google_token(token):
    try:
        idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)
        # idinfo 里包含了用户信息,比如
        userid = idinfo['sub']
        email = idinfo['email']
        return idinfo
    except ValueError:
        # token 无效
        return None

CLIENT_ID 是你在 Google Cloud Console 注册的客户端 ID,必须验证,防止别人伪造 token。


生成自己服务器的 JWT(可选)

验证通过后,你可以生成自己的 JWT 给客户端:

import jwt
import datetime

def create_jwt(user_info):
    payload = {
        'sub': user_info['sub'],
        'email': user_info['email'],
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
    }
    token = jwt.encode(payload, YOUR_SECRET_KEY, algorithm='HS256')
    return token

这样,后续前端访问你服务器接口时,带上你的 JWT 就好了。

Scroll to Top