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

如何在auth-astro(auth.js)中获取Strava的refresh_token?

如何在auth-astro中获取Strava的refresh_token及原始响应数据

问题核心:使用auth-astro完成Strava OAuth认证后,无法获取Strava返回的refresh_token、access_token和athlete对象,当前打印的token仅包含基础用户信息。

原因

Auth.js(auth-astro基于此)默认不会将OAuth provider返回的原始令牌数据(如refresh_token)存入默认的token对象,仅提取了用户基础身份信息(name、picture、sub等)。原始的Strava响应数据会在jwt回调的account参数中暴露。

解决方案

通过配置jwt回调捕获Strava的原始响应数据,将需要的字段存入token,后续可在session回调中传递或直接存储到后端。

修改后的auth.config.ts

import Strava, { type StravaProfile } from '@auth/core/providers/strava'
import { defineConfig } from 'auth-astro'

export default defineConfig({
    providers: [
        Strava({
            clientId: import.meta.env.STRAVA_CLIENT_ID,
            clientSecret: import.meta.env.STRAVA_CLIENT_SECRET,
            authorization: {
                params: {
                    scope: `read,read_all,profile:read_all,activity:read,activity:read_all`
                }
            }
        }),
    ],
    callbacks: {
        // 捕获Strava原始响应并存入token
        async jwt({ token, account, profile }) {
            // 首次认证时,account包含Strava的原始令牌数据
            if (account) {
                token.accessToken = account.access_token
                token.refreshToken = account.refresh_token
                token.expiresAt = account.expires_at
                // 将athlete对象存入token
                if (profile) {
                    token.athlete = (profile as any).athlete || profile
                }
            }
            return token
        },
        // 将需要的字段传递到session,供前端或后端使用
        async session({ session, token }) {
            session.user.accessToken = token.accessToken
            session.user.refreshToken = token.refreshToken
            session.user.expiresAt = token.expiresAt
            session.user.athlete = token.athlete
            return session
        },
    }
})

关键说明

  • jwt回调中的account参数:首次用户认证时,该参数包含Strava返回的完整令牌数据(access_token、refresh_token、expires_at等)。
  • profile参数:包含Strava返回的用户信息,其中athlete对象可直接提取。
  • 存储到后端:如果需要将refresh_token持久化到数据库,可在jwt回调中直接调用后端接口完成存储(注意处理异步逻辑)。

验证

修改后重新启动项目,认证完成后打印token或session,即可看到Strava的refresh_token、access_token和athlete数据。

内容的提问来源于stack exchange,提问作者tomly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:15:05