如何通过Next-auth获取Github REST API访问令牌?
解决Github登录后获取API访问令牌的问题
要在调用getServerSession(authOptions)时拿到Github API访问令牌,需要在NextAuth的配置中添加令牌存储逻辑,具体步骤如下:
1. 配置Github Provider的权限范围
在authOptions的Github Provider配置中,指定API所需的权限范围,确保Github返回具备对应权限的访问令牌:
import NextAuth from "next-auth"; import GithubProvider from "next-auth/providers/github"; export const authOptions = { providers: [ GithubProvider({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, // 根据需求设置权限范围,示例包含读取用户信息和仓库权限 authorization: { params: { scope: "read:user repo", }, }, }), ], // 回调用于将令牌存入会话 callbacks: { // 将访问令牌存入JWT async jwt({ token, account }) { if (account) { token.accessToken = account.access_token; } return token; }, // 将JWT中的令牌同步到session对象 async session({ session, token }) { session.user.accessToken = token.accessToken; return session; }, }, }; export default NextAuth(authOptions);
2. 验证会话中的令牌
配置完成后,调用getServerSession(authOptions)就能获取到包含访问令牌的会话数据:
"session": { "user": { "name": "UserName", "email": "xxxxxxxx@gmail.com", "image": "https://xxxxxx.xxxxxx/xxxxx", "accessToken": "gho_xxxxxxxxxxxxxx" } }
3. 使用令牌调用Github API
拿到令牌后,即可通过请求头携带令牌调用Github REST API:
const session = await getServerSession(authOptions); if (session?.user.accessToken) { const reposRes = await fetch("https://api.github.com/user/repos", { headers: { Authorization: `Bearer ${session.user.accessToken}`, }, }); const userRepos = await reposRes.json(); // 处理返回的仓库数据 }
注意事项
- 确保项目根目录的
.env文件中正确配置GITHUB_ID和GITHUB_SECRET,且Github OAuth应用的回调地址与项目地址一致。 - 权限范围遵循最小必要原则,避免请求多余权限,可根据需求调整
scope参数。
内容的提问来源于stack exchange,提问作者Dada878
相关产品推荐
相关产品推荐

