Skip to content

Token 与会话 ​

获取 access token ​

ts
import { getAccessToken, refreshAccessToken } from 'react-native-zalo-kit';

// 已保存的 Token;如果 60 秒内就要过期,会先刷新
const { accessToken } = await getAccessToken();

// 总是向 Zalo 请求新的 Token
const fresh = await refreshAccessToken(); // 等同于 getAccessToken({ forceRefresh: true })

没有会话时,getAccessToken() 会以 NOT_AUTHENTICATED reject。如果 Zalo 拒绝了 refresh token,Promise 会以 Zalo 的数字错误码 reject,这时需要重新调用 login()。

检查会话 ​

ts
import { isAuthenticated } from 'react-native-zalo-kit';

const loggedIn = await isAuthenticated();

isAuthenticated() 会向 Zalo 确认已保存的 refresh token 是否仍然有效:

  • true:会话有效;
  • false:没有会话,或会话已被 Zalo 拒绝;
  • 遇到网络或服务端错误时 reject,避免网络不稳定被误判为已退出登录。

刷新 ​

  • Zalo 的 access token 有效期很短(约 1 小时)。refresh token 有效期更长,但只能使用一次:每次刷新都会返回新的 refresh token,Zalo Kit 会替你保存。
  • getAccessToken() 和 getUserProfile() 会自动刷新。并发调用共用同一个刷新请求;isAuthenticated() 会等待正在进行的刷新完成,而不是去检查一个马上就要被替换的 Token。
  • 如果你的后端也用同一个 refresh token 刷新,双方会让对方的 Token 失效。请只让一方负责刷新。

存储 ​

  • Android:使用 Android Keystore 中的 AES-GCM 密钥加密,密钥不会离开 Keystore。如果设备上的 Keystore 不可用,Token 只保存在内存中,进程结束即失效。
  • iOS:以 kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 存入 Keychain。重新安装应用后会话会被清除,与 Android 行为一致。
  • 5.x 保存的 Token(位于 SharedPreferences / NSUserDefaults)会在首次使用时迁移,迁移成功后删除旧数据。

基于 MIT 许可证发布。