Supabase集成Notion认证后缺失provider_token问题求助
解决Supabase Notion认证无法获取provider_token的问题
你遇到的核心问题有两个:一是没从认证回调的URL中提取provider_token,二是错误地将Supabase的access_token当作Notion API的凭证使用。以下是具体解决步骤:
1. 从认证回调中提取provider_token
Supabase的OAuth回调URL的hash参数里包含provider_token(即Notion的API令牌),但你当前的代码只提取了Supabase自身的access_token和refresh_token。修改supabase.ts中的回调处理逻辑:
// Parse tokens from URL const authResult = qs.parse(splitUrl) const refreshToken = authResult.refresh_token as string const accessToken = authResult.access_token as string const providerToken = authResult.provider_token as string // 新增:提取Notion的provider token // 校验所有必需的令牌 if (!refreshToken || !accessToken || !providerToken) { console.error('Missing required tokens', authResult) return } ;(async () => { const { error } = await supabase.auth.setSession({ access_token: accessToken, refresh_token: refreshToken, }) if (error) console.error(error) // 将Notion的provider token存储到本地 await chrome.storage.local.set({ notionProviderToken: providerToken }) })()
2. 修正Notion Client的初始化逻辑
你之前错误地用Supabase的access_token初始化Notion Client,这是无效的——Supabase的token仅用于访问Supabase服务,Notion API需要的是provider_token。修改background.ts中的相关代码:
首先,更新storeNotionIdentity和setNotionClient的逻辑:
const setNotionClient = (notionProviderToken: string) => { notionClient = new Client({ auth: notionProviderToken, // 使用Notion的provider token }) } const storeNotionIdentity = async (): Promise<void> => { // 从本地存储获取provider token const { notionProviderToken } = await chrome.storage.local.get('notionProviderToken') if (notionProviderToken) { setNotionClient(notionProviderToken) } }
然后,在onAuthStateChange的SIGNED_IN事件中,调用storeNotionIdentity:
supabase.auth.onAuthStateChange(async (event, session) => { if (event === 'SIGNED_IN' || event === 'USER_UPDATED') { console.log('user is signed in :', session) if (session?.access_token && session?.refresh_token) { // 存储Supabase的会话信息(如果需要) await chrome.storage.local.set({ supabaseSession: { access_token: session.access_token, refresh_token: session.refresh_token } }) // 初始化Notion Client await storeNotionIdentity() } // ... 其他用户信息存储逻辑 } // ... 其他事件处理 })
最后,在处理GET_NOTION_PAGE消息时,确保使用正确的token:
else if (request.type === 'GET_NOTION_PAGE') { // 如果notionClient未初始化,从本地存储重新获取token创建 if (!notionClient) { const { notionProviderToken } = await chrome.storage.local.get('notionProviderToken') if (notionProviderToken) { setNotionClient(notionProviderToken) } else { sendResponse({ type: 'ERROR', message: 'Notion token not found' }) return } } try { const response = await notionClient.pages.retrieve(request.options) sendResponse({ type: 'SUCCESS', data: JSON.stringify(response) }) } catch (err) { sendResponse({ type: 'ERROR', message: (err as Error).message }) } }
关键说明
provider_token是OAuth提供商(这里是Notion)颁发的令牌,用于直接调用该提供商的API,而Supabase的access_token仅用于访问Supabase的服务,两者不能混用。- 由于Supabase的
session对象默认不会包含provider_token,必须从回调URL的hash参数中手动提取并存储。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

