我与 Clerk 一起使用 Expo(React Native)。为了与数据库对话,我使用 JWT 令牌以及职员提供的模板。我使用 Expo Secure Store 存储此令牌。
问题是:使用该令牌,我可以轻松与数据库通信,但是当我关闭应用程序并再次打开它时,我会注销,因为带有模板的令牌无效。
另一方面,当我存储没有模板的令牌时,它对职员有效,我可以在登录时关闭和打开应用程序,但由于我没有模板,因此令牌对后端无效。
这是否意味着我现在需要存储两个令牌?一个用于职员,另一个用于我的后端的模板化令牌?
当将 Clerk 与后端的自定义 JWT 模板一起使用时,您确实需要考虑两个方面:
文员会话管理:
这是由职员提供的令牌处理的,无需模板。它允许职员识别用户并维护他们的会话信息。 后端身份验证:这是由职员提供的令牌和您的自定义模板处理的。它包含您在后端 API 中授权所需的用户数据。 以下是解决此问题并避免存储两个单独令牌的方法:
利用 Clerk 的会话令牌进行持久化:
当用户成功使用 Clerk 登录时,它会生成一个会话令牌(没有模板)。该令牌在特定时间范围内有效(通常可在 Clerk 仪表板中配置)。 使用 expo-secure-store 安全地存储此 Clerk 会话令牌。 应用程序重新启动后,检索存储的会话令牌。 如果存在有效的会话令牌,请使用 Clerk.setUserFromToken 方法和会话令牌来补充 Clerk 的内部用户状态。这将允许您访问基本用户信息,而无需后端令牌。 按需获取后端令牌:
当您需要访问后端API中的资源时,请使用Clerk的getToken方法:
JavaScript
import { Clerk } from '@clerk/clerk-expo';
async function getBackendToken() {
const sessionToken = await retrieveToken(); // Retrieve Clerk session token
if (sessionToken) {
try {
await Clerk.setUserFromToken(sessionToken);
const backendToken = await Clerk.getToken(); // Fetch backend token
return backendToken;
} catch (error) {
console.error('Error retrieving tokens:', error);
return null;
}
} else {
// Handle case where no session token exists (user not logged in)
return null;
}
}
谨慎使用代码。 内容复制 这种方法可确保您仅在必要时获取后端令牌,从而减少需要存储和管理的令牌数量。
这种方法的好处:
简化的令牌管理:您只需要存储一个令牌,即 Clerk 会话令牌。 提高安全性:后端令牌不会持久存储,从而降低了泄露风险。 明确的关注点分离:Clerk 管理会话状态,而后端令牌处理 API 的授权。 请记住针对无效会话令牌或后端令牌检索失败等场景实施适当的错误处理和用户反馈机制。
其他提示:
考虑为 Clerk 的会话令牌实现刷新逻辑,以保持无缝的用户体验,即使它在应用程序会话期间过期也是如此。 请参阅 Clerk 的文档,了解有关其服务特定的令牌过期和刷新机制的详细信息。