实现GitHub和Google第三方登录

实现GitHub和Google第三方登录
第三方登录流程图如下:

一、在第三方平台创建OAuth

GitHub:
1.登录GitHub ➡ 右上角个人设置 ➡ 开发者设置

2.OAuth Apps  ➡ 右上角创建新OAuth应用  ➡ 重点填写Authorization callback URL;

Authorization callback URL为流程图中第七步第三方code和state返回的路径,后续前端用于获取系统服务端token

GitHub的Authorization callback URL返回路径没有具体要求,填什么地址,code和state就返到对应的页面

Enable Device Flow(是否启动设备流):

如无法使用web形式授权输入邮箱密码登录,启动设备流可通过其他设备扫码等形式完成授权登录

3.保存Client ID和Client secrets

Google:
1.登录https://console.cloud.google.com ➡ New project ➡ 测试项目信息可随意填写

3. App Information可随意填写  ➡ Audience选择External(外部) ➡ Contact Information填写联系邮箱  ➡  Finish  ➡ createe

4.Audience  ➡ 注意是否是测试阶段,下方Test users可以新增测试Google登录的测试账号;如果状态为已发布不是测试阶段,则不需要新增Test users

5.左上角Navigation menu (.)  ➡ APIs & Services  ➡ Credentials  ➡ 上方新增OAuth client ID

6.Web application  ➡ Authorized JavaScript origins项目主页url  

Authorized redirect URIs为流程图中第七步第三方code和state返回的路径,后续前端用于调后端接口获取系统服务端token

注意:Authorized redirect URIs只能填本地ip或者顶级域名

前端联调时可以填:http://127.0.0.1:xxxx(前端项目端口号)

可以传参,例如:http://127.0.0.1:xxxx?type=google

7.保存Client ID和Client secret

二、第三方授权url拼接逻辑

GitHub:

https://github.com/login/oauth/authorize?client_id=xxxx&state=xxxx&scope=user:email

client_id为OAuth中Client ID;

状态参数state为系统服务器生成,用于防止CSRF攻击

Google:

https://accounts.google.com/o/oauth2/v2/auth?client_id=xxxx&redirect_uri=xxxx&response_type=code&scope=openid+profile+email&state=xxxx

client_id为OAuth中Client ID;

redirect_uri为Google OAuth中填写的Authorized redirect URIs(一定要相同,否则禁止授权)

状态参数state为系统服务器生成,用于防止CSRF攻击

三、根据第三方用户信息code和state获取系统服务器用户token

1.验证code和state;

2.根据code访问第三方平台获取第三方平台token

3.根据第三方平台token获取第三方用户信息

4.根据第三方用户唯一标识查询当前用户是否存在

5.创建/更新用户信息

6.返回系统用户token

Read more

MySQL:表的增删查改

MySQL:表的增删查改

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 一、Create(insert) 语法: INSERT [INTO] table_name       [(column [, column] ...)]       VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ... [ ]内的是可以省略的 案例: 创建一个学生表  1.1 单行数据 + 指定列插入  value_list 数量必须和定义表的列的数量及顺序一致  可以不用指定id,因为mysql会用默认的值进行自增  1.2 单行数据 + 全列插入 全列插入可以省略values左侧的列属性   1.3 多行数据 + 全列插入 多行数据用逗号隔开

By Ne0inhk

2026年10大网络爬虫工具横评:从Scrapy到Bright Data,我为什么最终选择了“不写代码”?

作为一个写了多年爬虫、踩过无数反爬坑、被Cloudflare封到怀疑人生的全栈工程师。今天这篇文章,不是那种泛泛而谈的“Top 10工具推荐”,而是一次真实的技术选型复盘——在2025年底,我们团队为一个跨境电商竞品监控项目重新评估所有主流爬虫方案后,最终放弃自研、全面转向SaaS服务的决策过程。 如果你也曾: * 在凌晨三点调试Scrapy的IP代理池; * 被LinkedIn的JS指纹检测搞得想砸键盘; * 或者在老板问“为什么数据还没回来?”时无言以对…… 那么,请继续往下读。这可能是你今年看到的最实用的一篇爬虫工具评测。 我们到底要抓什么? 项目需求很典型: ✅ 实时监控全球50+电商平台(Amazon、eBay、Walmart、Zalando等) ✅ 抓取商品价格、库存、评论、促销信息 ✅ 每日抓取量 > 200万条 ✅ 数据延迟 < 15分钟 ✅ 关键要求:不能被封,不能丢数据 过去三年,我们用的是 Scrapy + 自建住宅代理池 + Playwright渲染 的混合架构。听起来很酷,但维护成本高得离谱—

By Ne0inhk
Ribbon - 微服务负载均衡演进史:从 Ribbon 到 Service Mesh(如 Istio)

Ribbon - 微服务负载均衡演进史:从 Ribbon 到 Service Mesh(如 Istio)

👋 大家好,欢迎来到我的技术博客! 💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长。 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕一个常见的开发话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Ribbon - 微服务负载均衡演进史:从 Ribbon 到 Service Mesh(如 Istio) * 🧭 背景与重要性 * 🎯 Ribbon:客户端负载均衡的经典代表 * 🔍 什么是 Ribbon? * 🛠️ Ribbon 的核心组件 * 💡 Java 示例:使用 Ribbon 实现简单的负载均衡调用 * 🧱 项目结构概览 * 📦 依赖配置 * 🚀 启动类配置 * 🔄 负载均衡服务调用控制器 * 🏢 提供者服务示例 * 🧪 配置文件

By Ne0inhk
SpringAOP详解(二)

SpringAOP详解(二)

一、代理模式的核心概念 1. 定义 为目标对象提供 “代理类”,让调用方不直接访问目标对象,而是通过代理类间接访问,从而在代理类中实现功能增强(比如日志、权限校验)。 2. 核心角色(以 “房屋租赁” 为例) 角色对应示例作用说明SubjectHouseSubject接口定义目标对象和代理类的共同行为(比如 “租房”)RealSubjectRealHouseSubject(房东)目标对象(被代理的实际业务执行者)ProxyHouseProxy(中介)代理类,包装目标对象,在调用目标方法前后添加增强逻辑 静态代理的实现步骤(以房屋租赁为例) 1. 定义共同接口(Subject) 2. 实现目标对象(RealSubject) 3. 实现代理类(Proxy) 4. 使用代理 静态代理的核心特点 * 提前创建:代理类的.class文件在程序运行前就已存在(比如HouseProxy是提前写好的); * 功能增强:不修改目标对象代码,通过代理类实现 “附加逻辑”

By Ne0inhk