
在许多 React Native 应用中,用户登录后会从后端 API 获取一个认证 Token。这个 Token 通常需要存储在客户端(例如使用 AsyncStorage)以便后续的 API 请求能够进行身份验证。一个典型的认证流程包括:
然而,在实现第四步时,开发者经常会遇到一个常见问题:尽管 Token 已成功存储,但后续的 API 调用却因为无法获取到有效的 Token 而失败,有时甚至会抛出 Invariant Violation 错误,提示尝试获取超出范围的索引。这通常是因为对 JavaScript 的异步操作理解不足,特别是当涉及到 AsyncStorage 这类异步存储机制时。
问题的核心在于 AsyncStorage.getItem() 是一个异步操作,它返回一个 Promise。如果不对这个 Promise 进行 await,那么变量将不会立即持有 Token 字符串,而是一个 Promise 对象。当这个 Promise 对象被用于字符串拼接(例如在 Authorization: \Token ${token}`` 中),JavaScript 会尝试将 Promise 对象转换为字符串,这通常会导致非预期的行为或错误。
解决上述问题的关键在于确保在需要使用 Token 的地方,正确地 await 异步 Token 检索函数。这意味着 retrieveToken() 函数的返回值必须在被使用前得到解析。
以下是修正后的 fetchCategoryData 函数示例:
import AsyncStorage from '@react-native-async-storage/async-storage';
// 登录请求函数
export const loginRequest = async (email, password) => {
try {
const response = await fetch("http://192.168.1.65:8000/api/user/token/", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
email: email,
password: password,
}),
});
const data = await response.json();
if (response.ok) {
// 注意:存储时键名应与检索时一致,这里统一为 "token"
await AsyncStorage.setItem("token", data.token);
return true;
} else {
// 根据实际API错误响应调整错误处理
throw new Error(data.detail || "Login failed");
}
} catch (error) {
console.error("Login error:", error);
throw new Error("Login failed");
}
};
// 检索 Token 函数
export const retrieveToken = async () => {
try {
// 从 AsyncStorage 中获取 Token
const token = await AsyncStorage.getItem("token");
return token;
} catch (error) {
console.error("Token retrieval error:", error);
return null;
}
};
// 获取分类数据的 API 调用函数
export const fetchCategoryData = async () => {
try {
// 关键修正:确保 await retrieveToken(),获取到实际的 Token 字符串
const token = await retrieveToken();
if (token) {
console.log("Retrieved Token:", token);
const response = await fetch("http://192.168.1.65:8000/api/categories/main_groups/", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Token ${token}`, // 使用获取到的 Token
},
});
if (!response.ok) {
// 处理非成功响应,例如 401 Unauthorized
const errorData = await response.json();
throw new Error(errorData.detail || `API request failed with status ${response.status}`);
}
return await response.json();
} else {
// 如果 Token 不存在,抛出错误或重定向到登录页
throw new Error("Authentication token not found.");
}
} catch (error) {
console.error("API call error:", error);
// 根据错误类型进行适当处理,例如:如果 Token 无效,可以尝试刷新或要求用户重新登录
throw error; // 重新抛出错误以便上层调用者处理
}
};代码解析与注意事项:
通过遵循这些指导原则和代码示例,您可以确保在 React Native 应用中,认证 Token 的获取和使用是可靠且安全的,从而为用户提供流畅的体验。
以上就是在 React Native 中安全地获取并使用认证 Token的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号