集成第三方OAuth 登录
- 集成github、google
- 使用better-auth
前置条件
- CLIENT_ID: 客户端ID (应用ID)
- 当你的应用想用 GitHub / Google 登录时,第三方平台需要知道哪个应用在请求用户授权
- 必须要配置CLIENT_ID才能在应用中实现登录
- OAuth App 的客户端 ID,用于让你的应用通过 *GitHub/Google 登录(OAuth)
- 获取用户授权。
- CLIENT_ID 获取位置:
- GitHub:Settings -> Developer settings -> OAuth Apps -> New OAuth App
- Google:Google Cloud Console -> APIs & Services -> Credentials -> Create OAuth Client ID (Web application)
- CLIENT_ID 获取位置:
OAuth授权行为
- 第一次授权后,Google/Github 会记住这个客户端,之后再登录就直接换 token,跳过授权页面
- prompt 是 OAuth 授权 URL 里的一个参数,用来控制授权页的行为
- 可以通过修改prompt来调整授权行为
- select_account:每次让用户选择账号
- consent:每次要用户授权
- none:不再弹授权页,直接用缓存(默认行为)
- login:如果会话过期才弹登录
github授权登录
- 参考文档:https://better-auth.com/docs/authentication/github
- 要使用 GitHub 登录,你需要客户端 ID 和客户端密钥
- 重定向 URL 设置为 :Better Auth 内部定义好的动态回调路由 (callback/github)
- 本地开发:
http://localhost:3000/api/auth/callback/github
- 本地开发:
注意:
- 授权地址URL和回调重定向 URI 只能配置一个
google授权登录
- 在google的云控制台配置;https://console.cloud.google.com
- 要使用 google登录,你需要客户端 ID 和客户端密钥
- 重定向URL设置为:Better Auth 内部定义好的动态回调路由 (callback/google)
注意:
- 和github不同,授权地址URL和回调重定向 URI 可以配置多个
- 本地授权登录,需要代理,因为google授权登录之后,需要通过node服务来获取google token
better-auth
- 文档
- BETTER_AUTH_SECRET
- secret对应的属性配置
- Better Auth 的应用级认证密钥
- 签名和校验登录 Cookie
- 加密 OAuth 状态等认证数据
- 参与认证数据的加密、签名和哈希
- 防止伪造登录会话
- better Auth 官方说明,所有 Cookie 都会使用这个
secret进行签名
- 回调地址
- 本地:
http://localhost:3000/api/auth/callback/google - 生产:
https://your-domain.com/api/auth/callback/google
- 本地:
- BETTER_AUTH_URL
- baseURL对应的路径、当前域名, 理解为认证服务的主机地址
- 配置了baseURL之后,Better Auth 会生成 redirect_uri回调地址
- Better Auth 校验 code 和 state,创建会话
数据库设计
- 账号表记录,如accounts
- 记录oauth三方平台的账号信息
- id、账号id、用户id、accessToken
- 会话表记录,如session
- 用户登录成功后,Better Auth 创建一条会话记录,并通过 HttpOnly Cookie 保存会话凭证
- 短期校验表记录,如verifacations
账号表记录
- 用于第三方账号绑定记录
- 用户绑定的一个 Google/GitHub/密码账号
accounts账号表记录- 如一个用户绑定多个登录方式
provider_id:平台名称,例如 google、github、credential
account_id:第三方平台的稳定用户 ID,Google 中通常是 sub,不能使用邮箱代替
user_id:关联本地 users.id
password:账号密码登录时保存密码哈希,Google 登录为空
access_token、refresh_token、id_token:OAuth 令牌
scope:授权范围
access_token_expires_at、refresh_token_expires_at:令牌过期时间
会话表记录
- 用于服务端登录会话
sessions会话表- 用户在一个浏览器或设备上的一次登录
- 如多设备同时登录、退出所有设备、会话过期
id:会话 ID
token:会话凭证
user_id:所属用户
expires_at:过期时间
ip_address:登录 IP,可选
user_agent:浏览器或设备信息,可选
created_at、updated_at:会话时间
短期校验表记录
邮箱注册登录,增加短期校验表,如果不需要邮箱注册登录,那么短期校验表可以不需要,注意短期校验表只是用于邮箱验证、找回密码
- 用于短期一次性校验
verifications校验表- 如用于保存临时的一次性校验记录、邮箱验证、找回密码、验证码等临时凭证
identifier:校验目标,例如邮箱或用户标识
value:验证码或一次性 Token
expires_at:过期时间
created_at、updated_at:时间字段