<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>LeoJin</title>
    <link>/</link>
    <description>Recent content on LeoJin</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 26 Dec 2024 00:05:36 +0800</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>2024 12 26 Google Oauth 前后端接入流程</title>
      <link>/posts/2024-12-26-google-oauth/</link>
      <pubDate>Thu, 26 Dec 2024 00:05:36 +0800</pubDate>
      
      <guid>/posts/2024-12-26-google-oauth/</guid>
      <description>&lt;h1 id=&#34;一整体流程&#34;&gt;一、整体流程&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;流程示意&#34; src=&#34;/posts/2024-12-26-google-oauth/images/login-google.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;二物料准备&#34;&gt;二、物料准备&lt;/h1&gt;
&lt;h2 id=&#34;1google-oauth-client&#34;&gt;1、Google Oauth Client&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目标：获取到&lt;code&gt;Client ID&lt;/code&gt;和&lt;code&gt;Client Secret&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;官方文档：&lt;a href=&#34;https://developers.google.com/identity/protocols/oauth2&#34;&gt;Oauth2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AI参考：&lt;a href=&#34;https://chatgpt.com/share/676d7aa9-aad4-8010-beff-e1ad2fe45976&#34;&gt;ChatGPT：GCP OAuth 登录集成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;入口：&lt;a href=&#34;https://console.cloud.google.com/&#34;&gt;Google Cloud Platform&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;进入&lt;code&gt;APIs &amp;amp; Services&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;进入&lt;code&gt;Credentials&lt;/code&gt;，点击&lt;code&gt;Create credentials&lt;/code&gt;，选择&lt;code&gt;OAuth client ID&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2google-console-search&#34;&gt;2、Google Console Search&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目标：证明网站所有权，用于通过Oauth发布到生产环境的平台审核。&lt;/li&gt;
&lt;li&gt;入口：&lt;a href=&#34;https://search.google.com/search-console&#34;&gt;Google Search Console&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;三关键开发项&#34;&gt;三、关键开发项&lt;/h1&gt;
&lt;h2 id=&#34;1-前端sdk接入&#34;&gt;1、 前端SDK接入&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;效果：&lt;img alt=&#34;登录按钮&#34; src=&#34;/posts/2024-12-26-google-oauth/images/login-google-button.png&#34;&gt;&lt;/li&gt;
&lt;li&gt;依赖：&lt;code&gt;Oauth Client ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;参考：&lt;a href=&#34;https://www.npmjs.com/package/@react-oauth/google&#34;&gt;@react-oauth/google&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;GoogleOAuthProvider&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;GoogleLogin&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;@react-oauth/google&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GoogleLoginComponent&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;onSuccess&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;GoogleOAuthProvider&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;clientId&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Your Oauth ClientID&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;GoogleLogin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;onSuccess&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;onSuccess&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;GoogleOAuthProvider&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-服务端接口&#34;&gt;2、 服务端接口&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;接收参数
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;idToken&lt;/code&gt;：前端从SDK获取的&lt;code&gt;Credentials&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;验证&lt;code&gt;Credentials&lt;/code&gt;，请求&lt;code&gt;https://oauth2.googleapis.com/tokeninfo&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;接口文档：&lt;a href=&#34;https://cloud.google.com/docs/authentication/token-types?hl=zh-cn#id&#34;&gt;官方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;返回主要信息：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sub&lt;/code&gt;：用户ID（可做为身份识别ID）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;：用户名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;picture&lt;/code&gt;：用户头像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;given_name&lt;/code&gt;：用户名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;family_name&lt;/code&gt;：用户姓氏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt;：用户邮箱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email_verified&lt;/code&gt;：邮箱是否验证&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aud&lt;/code&gt;：Oauth Client ID（需校验）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exp&lt;/code&gt;：过期时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新老用户逻辑：根据&lt;code&gt;sub&lt;/code&gt;查询用户，如果不存在则创建新用户&lt;/li&gt;
&lt;li&gt;Session处理：返回业务登录凭据&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;四开发发布&#34;&gt;四、开发&amp;amp;发布&lt;/h1&gt;
&lt;h2 id=&#34;1-开发测试&#34;&gt;1、 开发测试&lt;/h2&gt;
&lt;p&gt;在&lt;a href=&#34;https://console.cloud.google.com/auth/clients&#34;&gt;Google Auth Platform/Client ID for Web application&lt;/a&gt;中修改&lt;code&gt;Authorized JavaScript origins&lt;/code&gt;，填写本地开发环境和测试环境的地址（支持http://127.0.0.1:xxxx）&lt;/p&gt;</description>
      <content>&lt;h1 id=&#34;一整体流程&#34;&gt;一、整体流程&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;流程示意&#34; src=&#34;/posts/2024-12-26-google-oauth/images/login-google.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;二物料准备&#34;&gt;二、物料准备&lt;/h1&gt;
&lt;h2 id=&#34;1google-oauth-client&#34;&gt;1、Google Oauth Client&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目标：获取到&lt;code&gt;Client ID&lt;/code&gt;和&lt;code&gt;Client Secret&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;官方文档：&lt;a href=&#34;https://developers.google.com/identity/protocols/oauth2&#34;&gt;Oauth2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AI参考：&lt;a href=&#34;https://chatgpt.com/share/676d7aa9-aad4-8010-beff-e1ad2fe45976&#34;&gt;ChatGPT：GCP OAuth 登录集成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;入口：&lt;a href=&#34;https://console.cloud.google.com/&#34;&gt;Google Cloud Platform&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;进入&lt;code&gt;APIs &amp;amp; Services&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;进入&lt;code&gt;Credentials&lt;/code&gt;，点击&lt;code&gt;Create credentials&lt;/code&gt;，选择&lt;code&gt;OAuth client ID&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2google-console-search&#34;&gt;2、Google Console Search&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目标：证明网站所有权，用于通过Oauth发布到生产环境的平台审核。&lt;/li&gt;
&lt;li&gt;入口：&lt;a href=&#34;https://search.google.com/search-console&#34;&gt;Google Search Console&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;三关键开发项&#34;&gt;三、关键开发项&lt;/h1&gt;
&lt;h2 id=&#34;1-前端sdk接入&#34;&gt;1、 前端SDK接入&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;效果：&lt;img alt=&#34;登录按钮&#34; src=&#34;/posts/2024-12-26-google-oauth/images/login-google-button.png&#34;&gt;&lt;/li&gt;
&lt;li&gt;依赖：&lt;code&gt;Oauth Client ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;参考：&lt;a href=&#34;https://www.npmjs.com/package/@react-oauth/google&#34;&gt;@react-oauth/google&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;GoogleOAuthProvider&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;GoogleLogin&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;@react-oauth/google&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GoogleLoginComponent&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;onSuccess&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;GoogleOAuthProvider&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;clientId&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Your Oauth ClientID&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;GoogleLogin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;onSuccess&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;onSuccess&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;GoogleOAuthProvider&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-服务端接口&#34;&gt;2、 服务端接口&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;接收参数
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;idToken&lt;/code&gt;：前端从SDK获取的&lt;code&gt;Credentials&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;验证&lt;code&gt;Credentials&lt;/code&gt;，请求&lt;code&gt;https://oauth2.googleapis.com/tokeninfo&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;接口文档：&lt;a href=&#34;https://cloud.google.com/docs/authentication/token-types?hl=zh-cn#id&#34;&gt;官方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;返回主要信息：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sub&lt;/code&gt;：用户ID（可做为身份识别ID）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;：用户名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;picture&lt;/code&gt;：用户头像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;given_name&lt;/code&gt;：用户名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;family_name&lt;/code&gt;：用户姓氏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt;：用户邮箱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email_verified&lt;/code&gt;：邮箱是否验证&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aud&lt;/code&gt;：Oauth Client ID（需校验）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exp&lt;/code&gt;：过期时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新老用户逻辑：根据&lt;code&gt;sub&lt;/code&gt;查询用户，如果不存在则创建新用户&lt;/li&gt;
&lt;li&gt;Session处理：返回业务登录凭据&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;四开发发布&#34;&gt;四、开发&amp;amp;发布&lt;/h1&gt;
&lt;h2 id=&#34;1-开发测试&#34;&gt;1、 开发测试&lt;/h2&gt;
&lt;p&gt;在&lt;a href=&#34;https://console.cloud.google.com/auth/clients&#34;&gt;Google Auth Platform/Client ID for Web application&lt;/a&gt;中修改&lt;code&gt;Authorized JavaScript origins&lt;/code&gt;，填写本地开发环境和测试环境的地址（支持http://127.0.0.1:xxxx）&lt;/p&gt;
&lt;h2 id=&#34;2-发布正式&#34;&gt;2、 发布正式&lt;/h2&gt;
&lt;p&gt;在&lt;a href=&#34;https://console.cloud.google.com/auth/audience&#34;&gt;Google Auth Platform/Audience&lt;/a&gt;中，切换到&lt;code&gt;Production&lt;/code&gt;，提交审核，审核通过后即可上线使用。
审核期间如有问题，会有邮件通知（体验很快，1天内就给了反馈），根据邮件提示修改即可。&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>2024 11</title>
      <link>/posts/2024-11/</link>
      <pubDate>Wed, 06 Nov 2024 02:10:25 +0800</pubDate>
      
      <guid>/posts/2024-11/</guid>
      <description>&lt;p&gt;脑子里有个Idea很宏伟，想去实现它。&lt;/p&gt;</description>
      <content>&lt;p&gt;脑子里有个Idea很宏伟，想去实现它。&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>2024 04</title>
      <link>/posts/2024-04/</link>
      <pubDate>Wed, 09 Oct 2024 22:28:07 +0800</pubDate>
      
      <guid>/posts/2024-04/</guid>
      <description>&lt;p&gt;丽水&lt;/p&gt;</description>
      <content>&lt;p&gt;丽水&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>2024 03</title>
      <link>/posts/2024-03/</link>
      <pubDate>Sat, 02 Mar 2024 23:15:14 +0800</pubDate>
      
      <guid>/posts/2024-03/</guid>
      <description>&lt;p&gt;夏夏&lt;/p&gt;</description>
      <content>&lt;p&gt;夏夏&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Hello World</title>
      <link>/posts/hello-world/</link>
      <pubDate>Sun, 25 Jun 2023 01:14:27 +0800</pubDate>
      
      <guid>/posts/hello-world/</guid>
      <description>&lt;p&gt;Bye WordPress.&lt;/p&gt;
&lt;p&gt;Hello Hugo &amp;amp; Github.io.&lt;/p&gt;</description>
      <content>&lt;p&gt;Bye WordPress.&lt;/p&gt;
&lt;p&gt;Hello Hugo &amp;amp; Github.io.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
