[{"data":1,"prerenderedAt":591},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fconfig\u002Foauth":117,"\u002Fdocs\u002Fconfig\u002Foauth-surround":586},[4,28,69,103],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"快速开始","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"简介","i-lucide-home",{"title":13,"path":14,"stem":15,"icon":16},"一键部署","\u002Fdocs\u002Fgetting-started\u002Finstall","1.docs\u002F1.getting-started\u002F2.install","i-lucide-rocket",{"title":18,"path":19,"stem":20,"icon":21},"Docker 部署","\u002Fdocs\u002Fgetting-started\u002Fdocker","1.docs\u002F1.getting-started\u002F3.docker","i-lucide-container",{"title":23,"path":24,"stem":25,"icon":26},"宝塔面板部署","\u002Fdocs\u002Fgetting-started\u002Fbt-panel","1.docs\u002F1.getting-started\u002F4.bt-panel","i-lucide-panel-top",null,{"title":29,"path":30,"stem":31,"children":32,"page":68},"基础配置","\u002Fdocs\u002Fconfig","1.docs\u002F2.config",[33,38,43,48,53,58,63],{"title":34,"path":35,"stem":36,"icon":37},"基本配置","\u002Fdocs\u002Fconfig\u002Fbasic","1.docs\u002F2.config\u002F1.basic","i-lucide-settings",{"title":39,"path":40,"stem":41,"icon":42},"主题配置","\u002Fdocs\u002Fconfig\u002Ftheme","1.docs\u002F2.config\u002F2.theme","i-lucide-palette",{"title":44,"path":45,"stem":46,"icon":47},"通知配置","\u002Fdocs\u002Fconfig\u002Fnotification","1.docs\u002F2.config\u002F3.notification","i-lucide-bell",{"title":49,"path":50,"stem":51,"icon":52},"AI 配置","\u002Fdocs\u002Fconfig\u002Fai","1.docs\u002F2.config\u002F4.ai","i-lucide-sparkles",{"title":54,"path":55,"stem":56,"icon":57},"OAuth 配置","\u002Fdocs\u002Fconfig\u002Foauth","1.docs\u002F2.config\u002F5.oauth","i-lucide-key-round",{"title":59,"path":60,"stem":61,"icon":62},"上传配置","\u002Fdocs\u002Fconfig\u002Fupload","1.docs\u002F2.config\u002F6.upload","i-lucide-cloud-upload",{"title":64,"path":65,"stem":66,"icon":67},"导入导出","\u002Fdocs\u002Fconfig\u002Fimport-export","1.docs\u002F2.config\u002F7.import-export","i-lucide-arrow-right-left",false,{"title":70,"path":71,"stem":72,"children":73,"page":68},"使用指南","\u002Fdocs\u002Fguide","1.docs\u002F3.guide",[74,78,83,88,93,98],{"title":75,"path":76,"stem":77,"icon":16},"快速入门","\u002Fdocs\u002Fguide\u002Fquick-start","1.docs\u002F3.guide\u002F1.quick-start",{"title":79,"path":80,"stem":81,"icon":82},"用户管理","\u002Fdocs\u002Fguide\u002Fuser","1.docs\u002F3.guide\u002F2.user","i-lucide-users",{"title":84,"path":85,"stem":86,"icon":87},"文章管理","\u002Fdocs\u002Fguide\u002Farticle","1.docs\u002F3.guide\u002F3.article","i-lucide-file-text",{"title":89,"path":90,"stem":91,"icon":92},"文章编辑","\u002Fdocs\u002Fguide\u002Feditor","1.docs\u002F3.guide\u002F4.editor","i-lucide-pen-line",{"title":94,"path":95,"stem":96,"icon":97},"动态管理","\u002Fdocs\u002Fguide\u002Fmoment","1.docs\u002F3.guide\u002F5.moment","i-lucide-message-circle",{"title":99,"path":100,"stem":101,"icon":102},"友链管理","\u002Fdocs\u002Fguide\u002Ffriend","1.docs\u002F3.guide\u002F6.friend","i-lucide-link",{"title":104,"path":105,"stem":106,"children":107,"page":68},"获得帮助","\u002Fdocs\u002Fhelp","1.docs\u002F4.help",[108,113],{"title":109,"path":110,"stem":111,"icon":112},"常见问题","\u002Fdocs\u002Fhelp\u002Ffaq","1.docs\u002F4.help\u002F1.faq","i-lucide-circle-help",{"title":114,"path":115,"stem":116,"icon":97},"取得联系","\u002Fdocs\u002Fhelp\u002Fcontact","1.docs\u002F4.help\u002F2.contact",{"id":118,"title":54,"body":119,"description":580,"extension":581,"meta":582,"navigation":583,"path":55,"seo":584,"stem":56,"__hash__":585},"docs\u002F1.docs\u002F2.config\u002F5.oauth.md",{"type":120,"value":121,"toc":569},"minimark",[122,127,193,197,263,267,354,358,446,450,511,514,520,527,530,533,536,540,543,551,554,557,560,563,566],[123,124,126],"h2",{"id":125},"github-登录","GitHub 登录",[128,129,130,141,148,183],"ol",{},[131,132,133,134],"li",{},"进入 ",[135,136,140],"a",{"href":137,"rel":138},"https:\u002F\u002Fgithub.com\u002Fsettings\u002Fdevelopers",[139],"nofollow","GitHub Developer Settings",[131,142,143,144],{},"点击 ",[145,146,147],"em",{},"New OAuth App",[131,149,150,151],{},"填写信息：\n",[152,153,154,161,171,174],"ul",{},[131,155,156,160],{},[157,158,159],"strong",{},"Application name："," 应用名称，建议使用博客名称",[131,162,163,166,167],{},[157,164,165],{},"Homepage URL："," 应用主页 URL，如 ",[168,169,170],"code",{},"https:\u002F\u002F博客域名",[131,172,173],{},"Application description：应用描述，展示给正在登录的用户",[131,175,176,179,180],{},[157,177,178],{},"Authorization callback URL："," 回调地址 ",[168,181,182],{},"https:\u002F\u002F后端域名\u002Fapi\u002Fv1\u002Fauth\u002Fgithub\u002Fcallback",[131,184,185,186,189,190],{},"创建完成后复制 ",[168,187,188],{},"Client ID"," 和生成 ",[168,191,192],{},"Client Secret",[123,194,196],{"id":195},"google-登录","Google 登录",[128,198,199,212,246,256],{},[131,200,201,202,207,208,211],{},"我们首先需要访问 ",[135,203,206],{"href":204,"rel":205},"https:\u002F\u002Fconsole.developers.google.com\u002F",[139],"Google API Console"," 获取 OAuth 2.0 凭据，点击左侧边栏的 ",[145,209,210],{},"凭证"," 选项",[131,213,214,215,218],{},"创建一个 ",[145,216,217],{},"OAuth 客户端 ID",[152,219,220,226,231,238],{},[131,221,222,225],{},[157,223,224],{},"应用类型："," Web 应用",[131,227,228,160],{},[157,229,230],{},"名称：",[131,232,233,166,236],{},[157,234,235],{},"已获授权的 JavaScript 来源：",[168,237,170],{},[131,239,240,179,243],{},[157,241,242],{},"已获授权的重定向 URI：",[168,244,245],{},"https:\u002F\u002F后端域名\u002Fapi\u002Fv1\u002Fauth\u002Fgoogle\u002Fcallback",[131,247,248,249,252,253],{},"创建后，就可以看到 ",[168,250,251],{},"客户端 ID"," 和新增 ",[168,254,255],{},"客户端密钥",[131,257,258,259,262],{},"(可选)还可以在左侧边栏的 ",[145,260,261],{},"品牌塑造"," 里，设置应用信息来获得更长时间的支持",[123,264,266],{"id":265},"qq-登录","QQ 登录",[128,268,269,277,280,329,339,345,351],{},[131,270,133,271,276],{},[135,272,275],{"href":273,"rel":274},"https:\u002F\u002Fconnect.qq.com\u002F",[139],"QQ 互联"," 创建应用",[131,278,279],{},"选择创建网站应用，类型选择其他，名称建议使用博客名称，描述自定义",[131,281,282,283],{},"填写站点信息：\n",[152,284,285,292,301,307,323],{},[131,286,287,166,290],{},[157,288,289],{},"网站地址：",[168,291,170],{},[131,293,294,297,298],{},[157,295,296],{},"网站回调地址："," ",[168,299,300],{},"https:\u002F\u002F后端域名\u002Fapi\u002Fv1\u002Fauth\u002Fqq\u002Fcallback",[131,302,303,306],{},[157,304,305],{},"提供方："," 个人开发者需填写备案时使用的姓名",[131,308,309,312,313],{},[157,310,311],{},"网站地址备案号：","国内服务器备案号，若没有可联系客服解决，上同\n",[152,314,315],{},[131,316,317,322],{},[135,318,321],{"href":319,"rel":320},"https:\u002F\u002Fwiki.connect.qq.com\u002F%e5%bc%80%e5%8f%91%e8%80%85%e5%8f%8d%e9%a6%88",[139],"QQ互联WIKI"," 在此处找客服，建议选择腾讯开放平台网站客服，响应还是比较快的",[131,324,325,328],{},[157,326,327],{},"网站图标："," 100*100的站点图标，用于品牌塑造",[131,330,331,332,335,336],{},"创建完成后就可以看到 ",[168,333,334],{},"APP ID"," 和 ",[168,337,338],{},"APP Key",[131,340,341,344],{},[157,342,343],{},"注意："," 此时开启 QQ 登录是无法使用的，需要等待应用审核完成后才可使用",[131,346,347,350],{},[157,348,349],{},"特别注意："," 审核完成之前，博客端的 QQ 登录按钮要保留，也就是需要在管理端启用 QQ 登录方式",[131,352,353],{},"提示：官方文档里说审核需要花费 5 个工作日，如果不想等可以去上方提到的位置找客服（应该能立即通过）",[123,355,357],{"id":356},"microsoft-登录","Microsoft 登录",[128,359,360,367,378,404,413,431,440],{},[131,361,133,362],{},[135,363,366],{"href":364,"rel":365},"https:\u002F\u002Fportal.azure.com\u002F",[139],"Azure Portal",[131,368,369,370,373,374,377],{},"在 Azure 服务里找到 ",[145,371,372],{},"Microsoft Entra ID"," 进入，在左侧边栏找到",[145,375,376],{},"应用注册","，添加新注册",[131,379,380,381],{},"注册应用程序\n",[152,382,383,387,396],{},[131,384,385,160],{},[157,386,230],{},[131,388,389,392,393],{},[157,390,391],{},"受支持的帐户类型："," 选择 ",[168,394,395],{},"任何 Entra ID 租户 + 个人 Microsoft 帐户",[131,397,398,179,401],{},[157,399,400],{},"重定向 URI：",[168,402,403],{},"https:\u002F\u002F后端域名\u002Fapi\u002Fv1\u002Fauth\u002Fmicrosoft\u002Fcallback",[131,405,406,407,410,411],{},"注册后在概述页面，可以看到 ",[168,408,409],{},"应用程序(客户端) ID","，即 ",[157,412,188],{},[131,414,415,416,419,420,423,424,423,427,430],{},"在左侧边栏找到 ",[145,417,418],{},"API 权限","，添加 ",[168,421,422],{},"openid",", ",[168,425,426],{},"profile",[168,428,429],{},"email","（Microsoft Graph）",[131,432,433,434,437,438],{},"在左侧边栏找到",[145,435,436],{},"证书和密码","，新增客户端密码，期限最多 730 天，创建后表格中的值列，即 ",[157,439,192],{},[131,441,258,442,445],{},[145,443,444],{},"品牌打造和属性"," 里，设置应用信息来获得更专业的形象",[123,447,449],{"id":448},"oidc-登录","OIDC 登录",[128,451,452,460,471,487,500],{},[131,453,454,455],{},"选择合适的 OIDC 身份提供商并进入，比如 ",[135,456,459],{"href":457,"rel":458},"https:\u002F\u002Flogto.io\u002F",[139],"Logto",[131,461,462,463,466,467,470],{},"创建一个租户或者选择已有租户，找到 ",[145,464,465],{},"Applications"," 进入，创建一个 ",[145,468,469],{},"Traditional Web"," 应用",[131,472,282,473],{},[152,474,475,479],{},[131,476,477,160],{},[157,478,159],{},[131,480,481,179,484],{},[157,482,483],{},"Redirect URIs：",[168,485,486],{},"https:\u002F\u002F后端域名\u002Fapi\u002Fv1\u002Fauth\u002Foidc\u002Fcallback",[131,488,489,490,493,494,335,497],{},"然后在下面获取 ",[168,491,492],{},"Issuer endpoint","（即 Issuer URL）、 ",[168,495,496],{},"App ID",[168,498,499],{},"App secrets",[131,501,502,503,506,507,510],{},"(可选)在应用的 ",[145,504,505],{},"Branding"," 或者侧边栏的 ",[145,508,509],{},"Sign-in & account","，可以调整信息来获得更专业的形象",[123,512,513],{"id":513},"代理配置",[515,516,517],"p",{},[157,518,519],{},"Worker 代理",[515,521,522,523,526],{},"用于 OAuth 登录的 Cloudflare Worker 代理地址，解决国内服务器无法直接访问部分 OAuth 提供商的问题。默认使用 ",[168,524,525],{},"https:\u002F\u002Fproxy.flec.top","，可替换为自建 Worker。",[123,528,529],{"id":529},"更多登录方式",[515,531,532],{},"未来会不断去支持一些常用的登录方式",[534,535],"hr",{},[537,538,539],"h1",{"id":539},"关于登录",[515,541,542],{},"目前项目的登录方式支持五种：",[152,544,545,548],{},[131,546,547],{},"邮箱密码登录",[131,549,550],{},"四个 OAuth 登录",[515,552,553],{},"然而目前登录主要用于评论系统，它又提供了一种登录方式，即匿名登录。用户只需要提供昵称和邮箱，就可以完成，同时该用户会以游客身份记录在用户表中。",[515,555,556],{},"此时体现出邮箱作为用户唯一字段的重要性，简化了一层与用户名的转换，同时当新用户注册，可以根据获取到的邮箱与现有用户表中做对比，当存在游客使用过该邮箱，那么新增用户操作就会变成角色提升操作。",[515,558,559],{},"这样的设计，可以极大程度确保用户账号唯一性，但有例外：QQ 登录。该方式登录返回的凭证没有邮箱字段，也就是说无法进行邮箱对比，也就是说，QQ 登录的用户一定是新用户。（当然，如果一个游客的三方账号绑定的邮箱和游客邮箱不一致同样无法对比到，单独提到 QQ 是因为它连对比到的概率都没有）",[515,561,562],{},"把 QQ 登录结合评论系统一块来看，就能发现一个问题，评论系统是依靠用户或者游客的邮箱进行回信的，而 QQ 登录的用户邮箱是系统分配的一个随机邮箱，它无法让 QQ 登录的用户收到回信。",[515,564,565],{},"以上就是我对整个登录系统的概况，在保证绝对严密逻辑下，总有一些外部因素导致出现逻辑漏洞，QQ 登录作为国内主流登录方式之一，几乎是不可缺少的登录方式，只能去适应了。",[515,567,568],{},"我对登录系统还有很多想法，会再逐一实现，尽可能避免邮箱不一致的问题。",{"title":570,"searchDepth":571,"depth":571,"links":572},"",2,[573,574,575,576,577,578,579],{"id":125,"depth":571,"text":126},{"id":195,"depth":571,"text":196},{"id":265,"depth":571,"text":266},{"id":356,"depth":571,"text":357},{"id":448,"depth":571,"text":449},{"id":513,"depth":571,"text":513},{"id":529,"depth":571,"text":529},"FlecBlog 支持通过第三方账号快速登录，基于 Goth 库实现，目前支持 GitHub、Google、QQ、Microsoft 等主流平台。","md",{},{"icon":57},{"title":54,"description":580},"7E2loaZ1dZbWl2qsgIzxr4ftFlztDLatRllF-IwVgls",[587,589],{"title":49,"path":50,"stem":51,"description":588,"icon":52,"children":-1},"FlecBlog 集成 AI 能力与 MCP 协议，支持文章摘要生成、标题优化及 MCP 客户端管理。",{"title":59,"path":60,"stem":61,"description":590,"icon":62,"children":-1},"配置文件的存储方式，支持本地存储和多种云存储服务。",1782623948224]