如何在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
相关产品推荐
相关产品推荐

