API 认证方式科普 (For React Native Developers)
在移动端开发(如 React Native)中,我们经常需要与后端 API 进行交互。为了保证安全,API 通常需要进行身份验证(Authentication)。你在 Postman 或其他 API 调试工具中看到的那些选项,就是不同的认证标准和协议。
本文档旨在为你解释这些常见的认证方式,以及在 React Native 中如何使用它们。
1. No Auth (无认证)
含义:不需要任何身份验证即可访问 API。 场景:公开的 API,如获取天气信息、公共新闻列表等。 RN 实现:直接发起请求即可。
fetch('https://api.public.com/news');
2. API Key
含义:通过一个固定的密钥(Key)来标识调用者。通常在请求头(Header)或 URL 参数(Query Param)中传递。 场景:第三方服务(如 Google Maps、高德地图),用于统计用量和简单的权限控制。 RN 实现:
// 方式 A: URL 参数
fetch('https://api.example.com/data?api_key=YOUR_API_KEY');
// 方式 B: Header (更常见)
fetch('https://api.example.com/data', {
headers: {
'x-api-key': 'YOUR_API_KEY'
}
});
3. Bearer Token
含义:一种通用的令牌认证方式。"Bearer" 的意思是“持有者”,即“谁拿着这个令牌,谁就有权限”。
场景:最常见的现代 API 认证方式,通常结合 OAuth 2.0 使用。
RN 实现:在 Authorization Header 中添加 Bearer <Token>。
const token = 'eyJhbGciOi...'; // 从登录接口获取的 Token
fetch('https://api.example.com/profile', {
headers: {
'Authorization': `Bearer ${token}`
}
});
4. JWT Bearer
含义:JSON Web Token (JWT) 是一种具体的 Token 格式。JWT Bearer 实际上就是使用 JWT 格式的 Bearer Token。 特点:Token 本身包含用户信息(Payload),后端无需查库即可验证 Token 有效性(通过签名)。 场景:现代 Web 和移动应用的标准登录态维持。 RN 实现:同 Bearer Token。
5. Basic Auth
含义:最基础的认证方式。将 username:password 拼接后进行 Base64 编码,放入 Header 中。
格式:Authorization: Basic <Base64(username:password)>
场景:旧系统、内部简单的服务,或者获取 OAuth Token 的第一步(如你的 SalaryTokenApiService.js 中看到的那样)。
RN 实现:
import { btoa } from 'react-native-quick-base64'; // 或其他 Base64 库
const username = 'admin';
const password = '123';
const encoded = btoa(`${username}:${password}`);
fetch('https://api.example.com/login', {
headers: {
'Authorization': `Basic ${encoded}`
}
});
6. Digest Auth (摘要认证)
含义:Basic Auth 的升级版。密码不直接发送,而是发送密码的哈希(摘要)。服务器和客户端进行一系列随机数(Nonce)交换来验证身份。
场景:比 Basic Auth 安全,但实现复杂,现代 API 开发中很少使用(被 HTTPS + Token 取代)。
RN 实现:手动实现非常繁琐,通常需要依赖专门的库(如 react-native-digest-auth,但不推荐新项目使用)。
7. OAuth 1.0
含义:一种早期的开放授权标准。使用签名机制,请求参数极其复杂(Timestamp, Nonce, Signature 等)。
场景:非常老旧的系统(如早期的 Twitter API)。
RN 实现:极不推荐手动实现。必须使用专门的 OAuth 1.0 库(如 oauth-1.0a)。
8. OAuth 2.0
含义:目前行业标准的授权协议。它不是一种单一的认证方式,而是一个流程。 流程:
- 客户端(APP)向授权服务器请求授权。
- 用户同意。
- 客户端拿到 Access Token。
- 客户端用 Access Token (通常是 Bearer Token) 访问资源服务器。
场景:微信登录、Google 登录、企业级应用认证。
RN 实现:通常配合
react-native-app-auth等库来处理复杂的重定向和 Token 交换流程。
9. Hawk Authentication
含义:一种基于消息认证码(MAC)的认证方案,类似 OAuth 1.0 的简化版,主要用于 HTTP 请求的部分加密校验。
场景:极少见,主要用于一些对安全性有特殊要求但不想上完整 TLS/SSL 的微服务。
RN 实现:需使用 hawk 库。
10. AWS Signature (AWS 签名)
含义:亚马逊云服务(AWS)专用的 API 认证方式。需要使用 Access Key 和 Secret Key 对请求进行复杂的哈希签名(HMAC-SHA256)。
场景:直接在 APP 端调用 AWS 服务(如 S3 上传、Lambda 调用)。
RN 实现:通常不手动实现,而是使用 aws-amplify SDK,它会自动处理签名。
11. NTLM Authentication
含义:微软 Windows 系统的专有认证协议(New Technology LAN Manager)。 场景:企业内部网(Intranet),基于 IIS 的服务器,SharePoint 等。 RN 实现:React Native 很难原生支持 NTLM。通常需要原生模块支持或中间层代理。
12. Akamai EdgeGrid
含义:Akamai CDN 网络的专用 API 认证协议。 场景:管理 Akamai CDN 配置时使用。 RN 实现:作为移动端开发者几乎碰不到,这是服务端运维或 DevOps 关心的。
总结:RN 开发最常用的
作为 React Native 开发者,你 99% 的时间只会用到以下三种:
- Bearer Token (JWT): 用户登录后,后端给你一个 Token,你把它存到
AsyncStorage或MMKV,之后的请求都在 Header 里带上Authorization: Bearer <token>。 - API Key: 调用地图、统计等第三方 SDK 时配置。
- Basic Auth: 偶尔在登录接口或测试环境中使用。
希望这份指南能帮你理清这些概念!