尝试存储 Google OAuth 令牌时“向 SecureStore 提供的值大于 2048 字节”

Fez*_*sta 7 google-signin expo

我正在使用 Supabase 实现对我的 Expo 应用程序的 Google 登录,我将其设置为将令牌存储在 expo-secure-store 上,但是当我登录时,我收到以下警告:

向 SecureStore 提供的值大于 2048 字节。尝试存储此类值将在 SDK 35 中引发错误。

我正在使用 Expo 48。我尝试存储的令牌如下(已编辑):

{"access_token":"<REDACTED>","token_type":"<REDACTED>","expires_in":<REDACTED>,"refresh_token":"<REDACTED>","user":{"id":"<REDACTED>","aud":"<REDACTED>","role":"<REDACTED>","email":"<REDACTED>","email_confirmed_at":"<REDACTED>","phone":"<REDACTED>","confirmed_at":"<REDACTED>","last_sign_in_at":"<REDACTED>","app_metadata":{"provider":"<REDACTED>","providers":["<REDACTED>"]},"user_metadata":{"avatar_url":"<REDACTED>","email":"<REDACTED>","email_verified":<REDACTED>,"full_name":"<REDACTED>","iss":"<REDACTED>","name":"<REDACTED>","picture":"<REDACTED>","provider_id":"<REDACTED>","sub":"<REDACTED>"},"identities":[{"id":"<REDACTED>","user_id":"<REDACTED>","identity_data":{"avatar_url":"<REDACTED>","email":"<REDACTED>","email_verified":<REDACTED>,"full_name":"<REDACTED>","iss":"<REDACTED>","name":"<REDACTED>","picture":"<REDACTED>","provider_id":"<REDACTED>","sub":"<REDACTED>"},"provider":"<REDACTED>","last_sign_in_at":"<REDACTED>","created_at":"<REDACTED>","updated_at":"<REDACTED>"}],"created_at":"<REDACTED>","updated_at":"<REDACTED>"},"expires_at":<REDACTED>}
Run Code Online (Sandbox Code Playgroud)

我想我不是第一个尝试通过 Expo 实现 Google 登录的人,所以我想知道这个问题的普遍接受的解决方案是什么?

aly*_*lyx 1

也许不是理想的答案,但我最终从 supabase 返回的会话对象中删除了不太敏感的用户元数据:

function removeUserMetaData(itemValue: string) {
    let parsedItemValue = JSON.parse(itemValue);

    // Remove properties from the object
    if (parsedItemValue) {
        delete parsedItemValue.user?.identities;
        delete parsedItemValue.user?.user_metadata;
    }
    // Convert the modified object back to a JSON string
    return JSON.stringify(parsedItemValue);
}

const ExpoSecureStoreAdapter = {
    getItem: async (key: string) => {
        return SecureStore.getItemAsync(key);
    },
    setItem: (key: string, value: string) => {
        SecureStore.setItemAsync(key, removeUserMetaData(value));
    },
    removeItem: (key: string) => {
        SecureStore.deleteItemAsync(key);
    },
};
Run Code Online (Sandbox Code Playgroud)

并将用户元数据存储在单独的非安全存储中。