Tinymind开发指南:从NextAuth集成到GitHub API调用全流程
Tinymind是一款将GitHub转化为博客和思想管理中心的开源工具,通过NextAuth实现安全认证,利用GitHub API实现内容的读写与同步。本指南将带你完整了解从环境搭建到API调用的全流程,帮助开发者快速上手Tinymind开发。
准备工作:环境搭建与项目结构
开发环境配置
首先克隆Tinymind仓库到本地:
git clone https://gitcode.com/gh_mirrors/ti/tinymind
cd tinymind
npm install
项目基于Next.js构建,核心依赖包括:
- NextAuth.js:处理GitHub OAuth认证
- Octokit:GitHub API客户端
- Tailwind CSS:样式框架
核心目录结构解析
tinymind/
├── app/ # Next.js 13+ App Router
│ ├── api/ # API路由
│ │ └── auth/[...nextauth]/route.ts # NextAuth认证端点
├── lib/ # 核心逻辑
│ ├── auth.ts # NextAuth配置
│ └── githubApi.ts # GitHub API封装
└── components/ # UI组件
└── SessionProvider.tsx # 认证状态管理
NextAuth集成:实现GitHub认证
认证配置核心代码
Tinymind使用NextAuth实现GitHub OAuth认证,配置文件位于lib/auth.ts:
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: 'public_repo workflow' // 请求必要权限
}
}
}),
],
callbacks: {
async jwt({ token, account }) {
if (account?.access_token) {
token.accessToken = account.access_token // 存储访问令牌
}
return token
},
async session({ session, token }) {
session.accessToken = token.accessToken as string // 将令牌添加到会话
return session
}
}
}
认证流程实现
-
创建认证端点:
app/api/auth/[...nextauth]/route.tsimport NextAuth from "next-auth" import { authOptions } from "@/lib/auth" const handler = NextAuth(authOptions) export { handler as GET, handler as POST } -
提供认证状态:
components/SessionProvider.tsximport { SessionProvider as NextAuthSessionProvider } from "next-auth/react" export function SessionProvider({ children }) { return <NextAuthSessionProvider>{children}</NextAuthSessionProvider> } -
环境变量配置:在
.env.local中添加GITHUB_ID=your_github_client_id GITHUB_SECRET=your_github_client_secret NEXTAUTH_SECRET=your_nextauth_secret
GitHub API调用:内容管理实现
API封装核心类
Tinymind在lib/githubApi.ts中封装了GitHub API调用,使用Octokit客户端:
import { Octokit } from '@octokit/rest';
function getOctokit(accessToken: string) {
return new Octokit({ auth: accessToken });
}
核心功能实现
1. 仓库初始化
Tinymind会为用户自动创建名为tinymind-blog的仓库:
async function ensureRepoExists(octokit: Octokit, owner: string, repo: string) {
try {
await octokit.repos.get({ owner, repo });
} catch (error) {
if (error.status === 404) {
// 创建新仓库
await octokit.repos.createForAuthenticatedUser({
name: repo,
auto_init: true,
});
}
}
}
2. 博客文章管理
-
创建博客:
export async function createBlogPost(title: string, content: string, accessToken: string) { const octokit = getOctokit(accessToken); const { owner, repo } = await getRepoInfo(accessToken); const newId = generateSafeId(title); const path = `content/blog/${newId}.md`; await octokit.repos.createOrUpdateFileContents({ owner, repo, path, message: `Add blog post: ${title}`, content: Buffer.from(content).toString('base64'), }); return { newId }; } -
获取博客列表:
export async function getBlogPosts(accessToken: string): Promise<BlogPost[]> { const octokit = getOctokit(accessToken); const { owner, repo } = await getRepoInfo(accessToken); const response = await octokit.repos.getContent({ owner, repo, path: 'content/blog', }); // 处理响应,解析博客文章... }
3. 想法记录功能
想法功能使用JSON文件存储多条短内容:
export async function createThought(content: string, image: string | undefined, accessToken: string) {
const octokit = getOctokit(accessToken);
const { owner, repo } = await getRepoInfo(accessToken);
// 获取现有想法
const response = await octokit.repos.getContent({
owner, repo, path: 'content/thoughts.json',
});
const thoughts = JSON.parse(Buffer.from(response.data.content, 'base64').toString('utf-8'));
// 添加新想法
thoughts.unshift({
id: Date.now().toString(),
content,
timestamp: new Date().toISOString(),
image
});
// 保存更新
await octokit.repos.createOrUpdateFileContents({
owner, repo, path: 'content/thoughts.json',
content: Buffer.from(JSON.stringify(thoughts, null, 2)).toString('base64'),
sha: response.data.sha,
});
}
实际应用:API路由与组件集成
API路由实现
以博客文章API为例,创建app/api/github/route.ts:
import { getBlogPosts, createBlogPost } from '@/lib/githubApi';
import { getSession } from '@/lib/auth';
export async function GET() {
const session = await getSession();
if (!session?.accessToken) return new Response('Unauthorized', { status: 401 });
const posts = await getBlogPosts(session.accessToken);
return Response.json(posts);
}
export async function POST(request: Request) {
const session = await getSession();
if (!session?.accessToken) return new Response('Unauthorized', { status: 401 });
const { title, content } = await request.json();
const result = await createBlogPost(title, content, session.accessToken);
return Response.json(result);
}
前端组件集成
在组件中使用API:
// components/Editor.tsx
import { createThought, uploadImage } from "@/lib/githubApi";
import { useSession } from "next-auth/react";
export function Editor() {
const { data: session } = useSession();
const handleSave = async (content: string) => {
if (session?.accessToken) {
await createThought(content, null, session.accessToken);
}
};
// 组件渲染...
}
总结与扩展
通过本指南,你已经了解了Tinymind如何集成NextAuth实现GitHub认证,以及如何通过GitHub API实现博客和想法的管理功能。核心文件包括:
- 认证配置:
lib/auth.ts - API封装:
lib/githubApi.ts - 认证端点:
app/api/auth/[...nextauth]/route.ts
Tinymind还支持图片上传、多语言国际化等功能,你可以通过阅读源码进一步探索。祝开发愉快!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




