Tinymind开发指南:从NextAuth集成到GitHub API调用全流程

Tinymind开发指南:从NextAuth集成到GitHub API调用全流程

【免费下载链接】tinymind Tinymind - Write and sync your blog & thoughts with GitHub 【免费下载链接】tinymind 项目地址: https://gitcode.com/gh_mirrors/ti/tinymind

Tinymind是一款将GitHub转化为博客和思想管理中心的开源工具,通过NextAuth实现安全认证,利用GitHub API实现内容的读写与同步。本指南将带你完整了解从环境搭建到API调用的全流程,帮助开发者快速上手Tinymind开发。

Tinymind项目 banner

准备工作:环境搭建与项目结构

开发环境配置

首先克隆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
    }
  }
}

认证流程实现

  1. 创建认证端点app/api/auth/[...nextauth]/route.ts

    import NextAuth from "next-auth"
    import { authOptions } from "@/lib/auth"
    
    const handler = NextAuth(authOptions)
    export { handler as GET, handler as POST }
    
  2. 提供认证状态components/SessionProvider.tsx

    import { SessionProvider as NextAuthSessionProvider } from "next-auth/react"
    
    export function SessionProvider({ children }) {
      return <NextAuthSessionProvider>{children}</NextAuthSessionProvider>
    }
    
  3. 环境变量配置:在.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项目logo

总结与扩展

通过本指南,你已经了解了Tinymind如何集成NextAuth实现GitHub认证,以及如何通过GitHub API实现博客和想法的管理功能。核心文件包括:

  • 认证配置:lib/auth.ts
  • API封装:lib/githubApi.ts
  • 认证端点:app/api/auth/[...nextauth]/route.ts

Tinymind还支持图片上传、多语言国际化等功能,你可以通过阅读源码进一步探索。祝开发愉快!

【免费下载链接】tinymind Tinymind - Write and sync your blog & thoughts with GitHub 【免费下载链接】tinymind 项目地址: https://gitcode.com/gh_mirrors/ti/tinymind

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值