You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:48:12