使用 oauth2-proxy 为你的网站再加一层保护!

网安大年随着 LLM 能力逐渐变强, 各种项目天天被扫出来各种越来越要命的洞. 最近的, 比如 Nginx, XBoard 的漏洞, 其实还好: 最多是导致服务中断; 可随着 nezha, MCSM 之类的有极高权限的应用也被扫出极其低级的路径穿越漏洞, 事情变得不妙了, 你用密码生成器生成的强密码, 可能只能拦得住你自己了.

为此, 我们需要一个更通用的, 更安全的鉴权方式, 比如双向证书验证之类? 但这也太商务了. 我们只是需要一个中间反代层, 来进行前置鉴权.

简单研究一圈, oauth2-proxy 既符合我的需求, 又不会像其他满足需求的项目, 比如 Pomerium 一样显得太重.

而且, 我用 Google / GitHub 登录, 很难被黑了吧?

然后给我的核心服务套好了 OAuth, 这里提供一份基础的可以快捷修改开始使用的配置文件, 附带完整说明, 修改好后即可启动服务:

# ============================================================
# oauth2-proxy v7.15.x 通用简单生产配置示例
# By TomyJan V2026.07.24
#
# 项目地址: https://github.com/oauth2-proxy/oauth2-proxy
# 配置发布: https://blog.tomys.top/2026-07/oauth2-proxy/
#
# 官方文档:
# https://oauth2-proxy.github.io/oauth2-proxy/
#
# 官方示例配置: 
# https://github.com/oauth2-proxy/oauth2-proxy/blob/master/contrib/oauth2-proxy.cfg.example
#
# 配置文件格式:
#   传统 TOML 配置,不使用 Alpha YAML 配置。
#
# 默认部署结构:
#   用户 -> CDN/Nginx -> oauth2-proxy -> 业务上游
#
# 默认工作模式:
#   1. Nginx/CDN 负责公网 HTTPS 和证书。
#   2. oauth2-proxy 仅监听本机 HTTP。
#   3. oauth2-proxy 完成认证后直接反代业务上游。
#
# 其他常见模式也已在文件中说明:
#   - oauth2-proxy 自己监听 HTTPS
#   - oauth2-proxy 直接暴露到公网
#   - oauth2-proxy 不反代业务,仅配合 Nginx auth_request 鉴权
#
# 请认真阅读注释说明来修改配置. 使用前至少需要修改:
#   client_id
#   client_secret
#   oidc_issuer_url
#   redirect_url
#   cookie_secret
#   cookie_name
#   upstreams
#   whitelist_domains
#
# 检查配置:
#   oauth2-proxy --config=./oauth2-proxy.cfg --config-test
#
# 启动服务:
#   oauth2-proxy --config=./oauth2-proxy.cfg
# ============================================================


# ============================================================
# 一、监听地址
# ============================================================

# ------------------------------------------------------------
# 默认模式:监听本机 HTTP,由 Nginx/CDN 负责公网 HTTPS
# ------------------------------------------------------------
#
# 这是最常见、最容易维护的生产部署方式。
#
# 仅监听 127.0.0.1,其他设备无法直接访问该端口,
# 可以避免用户绕过 Nginx/CDN 直接访问 oauth2-proxy。
#
# 常见结构:
#
#   用户 HTTPS 请求
#        ↓
#   Nginx/CDN :443
#        ↓ HTTP
#   oauth2-proxy 127.0.0.1:4180
#        ↓
#   业务上游
#
http_address = "127.0.0.1:4180"


# ------------------------------------------------------------
# 可选模式:oauth2-proxy 自己监听 HTTPS
# ------------------------------------------------------------
#
# 当 oauth2-proxy 需要直接提供 HTTPS 时,注释上面的
# http_address,并取消下面三项的注释:
#
# https_address = "0.0.0.0:8443"
# tls_cert_file = "/etc/ssl/example.com/fullchain.pem"
# tls_key_file  = "/etc/ssl/example.com/privkey.pem"
#
# tls_min_version 默认值为 TLS1.2,通常不需要修改。
#
# tls_min_version = "TLS1.2"
#
# 注意:
#   启用 https_address 并不会自动关闭 http_address。
#   如果不希望同时监听 HTTP,应将 http_address 注释掉。
#
# 如果必须同时提供 HTTP 和 HTTPS,可以同时配置:
#
# http_address  = "127.0.0.1:4180"
# https_address = "0.0.0.0:8443"
#
# 但多数生产环境只需要保留一种入口。


# ------------------------------------------------------------
# 可选模式:允许其他服务器访问 HTTP 监听端口
# ------------------------------------------------------------
#
# 当 Nginx、负载均衡器或 CDN 回源节点不在本机时,可以键上方 http_address 改为:
#
# http_address = "0.0.0.0:4180"
#
# 此时必须同时使用防火墙、安全组或访问控制列表,
# 只允许可信反向代理访问 4180 端口。
#
# 不建议将未加密的 HTTP 监听端口直接暴露给公网用户。


# ------------------------------------------------------------
# 可选:健康检查与监控地址
# ------------------------------------------------------------
#
# oauth2-proxy 内置以下健康检查接口:
#
#   /ping   基础存活检查,正常时返回 HTTP 200
#   /ready  就绪检查,正常时返回 HTTP 200
#
# 可选的 Prometheus 指标监听地址。
# 默认不启用独立指标监听。
#
# metrics_address = "127.0.0.1:44180"


# ============================================================
# 二、反向代理环境
# ============================================================

# oauth2-proxy 位于 Nginx、CDN、负载均衡器、Ingress、
# Caddy 或 Traefik 后面时,应启用此项。
#
# 启用后,oauth2-proxy 会按照反向代理模式处理
# X-Forwarded-Proto、X-Forwarded-Host 等请求头。
#
# 使用 Nginx auth_request 或其他 ForwardAuth 模式时,
# 也应保持为 true。
reverse_proxy = true

# 可选配置,oauth2-proxy 信任的反代 IP。示例:
# trusted_proxy_ips = [
#     "127.0.0.1/32",
#     "::1/128"
# ]


# ============================================================
# 三、业务上游
# ============================================================

# ------------------------------------------------------------
# 默认模式:oauth2-proxy 直接反代业务服务
# ------------------------------------------------------------
#
# 用户认证成功后,oauth2-proxy 会把请求转发到该地址。
#
# 地址末尾建议保留 "/",以免路径拼接结果与预期不符。
#
# HTTP 上游示例:
#
# upstreams = [
#     "http://127.0.0.1:8080/"
# ]
#
# HTTPS 上游示例:
#
# upstreams = [
#     "https://127.0.0.1:32768/"
# ]
#
upstreams = [
    "http://127.0.0.1:8080/"
]


# 支持 WebSocket 连接。
#
# MCSManager、网页终端、实时日志、在线编辑器、
# 消息服务等应用通常需要保持开启。
proxy_websockets = true


# 将用户请求中的原始 Host 请求头传递给业务上游。
#
# 上游使用虚拟主机、生成绝对 URL 或校验访问域名时,
# 通常需要保持为 true。
pass_host_header = true


# ------------------------------------------------------------
# 跳过 HTTPS 上游证书验证
# ------------------------------------------------------------
#
# 默认 false:正常验证上游服务器的 TLS 证书。
#
# 只有以下情况才考虑改为 true:
#
#   - 上游使用自签名证书;
#   - 使用 127.0.0.1 访问,但证书签发给域名;
#   - 内部证书链尚未加入系统信任库。
#
# 设置为 true 会跳过上游证书验证,安全性较低。
# 优先考虑安装正确证书或将内部 CA 加入系统信任库。
ssl_upstream_insecure_skip_verify = false


# ============================================================
# 四、OIDC 身份提供方
# ============================================================

# 支持 通用 OIDC,也支持 GitHub 等常见第三方提供商。
# 
# 不同提供商所需字段有所不同,详见:
# https://oauth2-proxy.github.io/oauth2-proxy/configuration/providers/
# 此处使用 OIDC 作为示例:
provider = "oidc"
provider_display_name = "Casdoor"


# 在身份提供方中创建的 OAuth/OIDC Client ID。
client_id = "CHANGE_ME_CLIENT_ID"


# 对应应用的 Client Secret。
# !!!谨防泄露!!!
client_secret = "CHANGE_ME_CLIENT_SECRET"


# OIDC Issuer 地址。
#
# 必须与身份提供方 Discovery 文档中的 issuer 完全一致。
# 一般不要在末尾额外添加路径或斜杠。
#
# Casdoor 示例:
# oidc_issuer_url = "https://auth.example.com"
oidc_issuer_url = "https://auth.example.com"


# OAuth 登录完成后的回调地址。
#
# 必须与身份提供方应用中登记的 Redirect URI 完全一致,
# 包括协议、域名、端口和路径。
#
# Nginx 在公网提供 HTTPS、oauth2-proxy 在本机监听 HTTP 时,
# 这里仍然应填写用户实际访问的公网 HTTPS 地址。
#
# oauth2-proxy 内置的回调路径是 /oauth2/callback,通常不需要修改。
redirect_url = "https://service.example.com/oauth2/callback"

# 强制 OAuth 回调后使用相对路径,
# 避免绝对 URL 的域名校验导致回退到 / 。
# 一般无需使用。
# relative_redirect_url = true


# 常用 OIDC Scope。
#
# openid 是 OIDC 必需 Scope。
# profile 通常包含姓名、用户名等基础资料。
# email 通常用于取得用户邮箱。
scope = "openid profile email"


# 启用 PKCE S256。
#
# 当身份提供方的 Discovery 文档声明支持 S256 时建议启用。
code_challenge_method = "S256"


# 允许登录的邮箱域名。
#
# ["*"] 表示允许任何邮箱域名。
#
# 仅允许指定组织邮箱时,例如:
#
# email_domains = [
#     "example.com",
#     "example.org"
# ]
#
email_domains = ["*"]


# 只有一个身份提供方时,跳过 oauth2-proxy 自带的
# Provider 选择页面,直接跳转到身份提供方登录。
skip_provider_button = true


# ------------------------------------------------------------
# 可选:允许未验证邮箱
# ------------------------------------------------------------
#
# 部分身份提供方可能不返回 email_verified=true。
#
# 只有在确认身份提供方返回的邮箱可信时,才考虑启用:
#
# insecure_oidc_allow_unverified_email = true
#
# 默认不要开启。


# ============================================================
# 五、Cookie 与会话
# ============================================================

# 默认使用 Cookie 保存会话,不依赖 Redis。
#
# Cookie 模式部署简单,适合用户信息和 Token 较小的场景。
# 如果身份提供方返回大量 groups、roles 或其他 Claims,
# 会话 Cookie 可能超过浏览器或代理的单个 Cookie 限制。
session_store_type = "cookie"


# Cookie 加密和签名密钥。
#
# 每个独立服务都应该使用不同的随机值。
#
# Linux 生成示例:
#
# openssl rand -base64 32 | tr -- '+/' '-_'
#
# 不要直接使用本模板中的占位值。
cookie_secret = "CHANGE_ME_RANDOM_COOKIE_SECRET"


# Cookie 名称。
#
# 同一域名或关联子域部署多个 oauth2-proxy 时,
# 每个服务应使用不同名称,避免会话互相覆盖。
#
# 建议只使用字母、数字和下划线。
cookie_name = "_oauth2_proxy_SERVICENAME"


# 只通过 HTTPS 发送认证 Cookie。
#
# 生产环境使用公网 HTTPS 时应保持 true。
#
# 只有本地纯 HTTP 测试环境才考虑设置为 false。
cookie_secure = true


# 禁止浏览器 JavaScript 读取认证 Cookie。
cookie_httponly = true


# SameSite=Lax 适用于大多数普通 OIDC 重定向登录。
#
# 可选值通常包括:
#   lax
#   strict
#   none
#   空字符串
#
# 使用 none 时,浏览器通常要求 cookie_secure=true。
cookie_samesite = "lax"


# Cookie 对整个站点路径生效。
cookie_path = "/"


# 会话最长有效时间。
#
# 168h 等于 7 天。
cookie_expire = "168h"


# 定期刷新 OAuth 会话的时间间隔。
#
# "0" 表示不主动刷新。
#
# 启用刷新时,例如:
#
# cookie_refresh = "1h"
#
# 需要会话中保留 OAuth Token。
cookie_refresh = "1h"


# ------------------------------------------------------------
# 可选:最小 Cookie 会话
# ------------------------------------------------------------
#
# 启用后,Cookie 会话中只保留较少的信息,
# 可以降低 Cookie 过大的可能性。
#
# session_cookie_minimal = true
#
# 重要限制:
#
#   session_cookie_minimal = true
#
# 与以下配置不能同时使用:
#
#   cookie_refresh > 0
#
# 因为刷新 OAuth 会话需要 Token,而最小会话不保存这些 Token。
#
# 如果启用最小会话,应保持:
#
# cookie_refresh = "0"
#
# 如果业务需要向上游传递 Access Token,
# 或需要 oauth2-proxy 自动刷新 Token,则不要启用最小会话。
#
# 通用模板默认关闭,避免影响需要 Token 的应用。
session_cookie_minimal = false


# ------------------------------------------------------------
# 可选:跨子域共享 Cookie
# ------------------------------------------------------------
#
# 默认不设置 cookie_domains。
#
# 不设置时,Cookie 只属于当前主机,隔离性更好。
#
# 只有多个可信子域确实需要共享登录状态时才启用:
#
# cookie_domains = [
#     ".example.com"
# ]
#
# 请确认该父域下所有子域都可信,否则其中一个子域出现
# 安全问题时可能影响共享认证 Cookie。


# ============================================================
# 六、向业务上游传递身份信息
# ============================================================

# 在请求中加入 X-Auth-Request-* 身份头。
#
# 常见头包括:
#   X-Auth-Request-User
#   X-Auth-Request-Email
#   X-Auth-Request-Preferred-Username
#
# 普通“只要求登录,不关心具体用户”的业务可以保持 false。
#
# 如果上游需要读取登录用户名或邮箱,可以改为 true。
set_xauthrequest = false


# 将 ID Token 或 Access Token 作为 Authorization 响应头输出。
#
# 普通 Web 面板不需要时,应保持 false。
set_authorization_header = false


# 将客户端原有 Authorization 请求头传递给上游。
#
# 业务不需要处理 Bearer Token 时保持 false。
pass_authorization_header = false


# 将 OAuth Access Token 传递给上游。
#
# 只有业务需要调用用户 API 或验证 Access Token 时才开启。
#
# 开启前应确认上游可信,并注意 Token 的泄露风险。
pass_access_token = false


# ============================================================
# 七、登录跳转限制
# ============================================================

# 允许登录完成后跳转到的域名。
#
# 用于限制 rd 等参数可以跳转的目标,降低开放重定向风险。
#
# 使用非标准端口时,应包含端口:
#
# whitelist_domains = [
#     "service.example.com:8443"
# ]
#
# 多个受保护域名示例:
#
# whitelist_domains = [
#     "service.example.com",
#     ".internal.example.com"
# ]
#
whitelist_domains = [
    "service.example.com"
]


# ============================================================
# 八、日志
# ============================================================

# oauth2-proxy 自身运行日志。
standard_logging = true


# 登录成功、登录失败等认证事件日志。
auth_logging = true


# 每次 HTTP 请求的访问日志。
request_logging = true


# 请求日志格式。
#
# 保留 RequestID 便于排查:
#   - CDN 重复回源 (说的就是你, 又拍云)
#   - 负载均衡重试
#   - 上游响应异常
request_logging_format = "{{.Client}} - {{.RequestID}} - {{.Host}} {{.RequestMethod}} {{.Upstream}} \"{{.RequestURI}}\" {{.Protocol}} {{.StatusCode}}"


# 是否在错误页面上显示详细调试信息。
#
# 生产环境建议保持 false,避免向用户暴露内部信息。
show_debug_on_error = false


# ============================================================
# 九、oauth2-proxy 内置路径
# ============================================================

# 默认认证路径前缀是 /oauth2。
#
# oauth2-proxy 会自行处理以下常见地址:
#
#   /oauth2/sign_in
#       登录页面
#
#   /oauth2/start
#       开始 OAuth/OIDC 登录流程
#
#   /oauth2/callback
#       身份提供方登录完成后的回调地址
#
#   /oauth2/auth
#       仅检查认证状态
#       已认证通常返回 202
#       未认证返回 401
#       主要供 Nginx auth_request/ForwardAuth 使用
#
#   /oauth2/userinfo
#       返回当前会话的用户信息
#
#   /oauth2/sign_out
#       清除 oauth2-proxy 自身的认证 Cookie
#
#   /ping
#       存活检查
#
#   /ready
#       就绪检查
#
# CDN 或负载均衡健康检查建议使用 /ping,
# 不要使用 /oauth2/callback 等。


# ============================================================
# 十、切换为 Nginx auth_request 纯鉴权模式
# ============================================================

# 默认情况下,本配置由 oauth2-proxy 直接反代业务上游:
#
#   Nginx/CDN
#       ↓
#   oauth2-proxy
#       ↓
#   业务服务
#
# 如果希望保持原有 Nginx 直接反代业务的结构,
# 只让 oauth2-proxy 提供认证,可以使用:
#
#   用户
#     ↓
#   Nginx
#     ├── /oauth2/* -> oauth2-proxy
#     ├── auth_request /oauth2/auth
#     └── 认证成功后 -> 原业务上游
#
# 这种模式下,业务请求不会经过 oauth2-proxy,
# oauth2-proxy 只处理登录路径和认证检查。
#
#
# ------------------------------------------------------------
# oauth2-proxy 需要修改的配置
# ------------------------------------------------------------
#
# 将本文件前面的 upstreams 改为:
#
# upstreams = [
#     "static://202"
# ]
#
# 同时建议设置:
#
# proxy_websockets = false
# set_xauthrequest = true
#
# 必须保持:
#
# reverse_proxy = true
#
# redirect_url 仍然填写用户访问的公网地址,例如:
#
# redirect_url = "https://service.example.com/oauth2/callback"
#
#
# ------------------------------------------------------------
# 对应的 Nginx 基础示例
# ------------------------------------------------------------
#
# 以下内容应放入 Nginx server 块,不是 TOML 配置:
#
# location /oauth2/ {
#     proxy_pass http://127.0.0.1:4180;
#
#     proxy_set_header Host $host;
#     proxy_set_header X-Real-IP $remote_addr;
#     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#     proxy_set_header X-Forwarded-Proto $scheme;
#
#     # 登录成功后返回用户原来访问的地址。
#     proxy_set_header X-Auth-Request-Redirect $scheme://$host$request_uri;
# }
#
# location = /oauth2/auth {
#     proxy_pass http://127.0.0.1:4180;
#
#     proxy_pass_request_body off;
#     proxy_set_header Content-Length "";
#
#     proxy_set_header Host $host;
#     proxy_set_header X-Real-IP $remote_addr;
#     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#     proxy_set_header X-Forwarded-Proto $scheme;
#     proxy_set_header X-Original-URI $request_uri;
# }
#
# location / {
#     auth_request /oauth2/auth;
#
#     # 未登录时跳转到 oauth2-proxy 登录入口。
#     error_page 401 =403 /oauth2/sign_in;
#
#     # 从鉴权子请求中取得用户信息。
#     auth_request_set $auth_user  $upstream_http_x_auth_request_user;
#     auth_request_set $auth_email $upstream_http_x_auth_request_email;
#
#     # 可选:把用户信息传给真正的业务服务。
#     proxy_set_header X-Auth-Request-User  $auth_user;
#     proxy_set_header X-Auth-Request-Email $auth_email;
#
#     # 原有业务上游。
#     proxy_pass http://127.0.0.1:8080;
#
#     proxy_set_header Host $host;
#     proxy_set_header X-Real-IP $remote_addr;
#     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#     proxy_set_header X-Forwarded-Proto $scheme;
#
#     # 业务使用 WebSocket 时保留原有 WebSocket 配置。
# }
#
# 提示:
#
# 官方示例通常会将 401 重定向到 /oauth2/sign_in,
# 实际部署也可以直接跳转到:
#
# /oauth2/start?rd=$scheme://$host$request_uri
#
# 具体选择取决于是否希望显示 oauth2-proxy 登录页面。


# ============================================================
# 十一、常用模式快速修改表
# ============================================================

# ------------------------------------------------------------
# 模式 A:Nginx 提供 HTTPS 端点,oauth2-proxy 直接反代业务
# ------------------------------------------------------------
#
# http_address = "127.0.0.1:4180"
# reverse_proxy = true
# upstreams = ["http://127.0.0.1:8080/"]
#
# Nginx:
#   HTTPS :443 -> oauth2-proxy :4180
#
# 这是本模板的默认模式。


# ------------------------------------------------------------
# 模式 B:oauth2-proxy 自己提供 HTTPS 端点并直接反代业务
# ------------------------------------------------------------
#
# 注释:
# http_address = "127.0.0.1:4180"
#
# 启用:
# https_address = "0.0.0.0:8443"
# tls_cert_file = "/path/fullchain.pem"
# tls_key_file  = "/path/privkey.pem"
#
# upstreams = ["http://127.0.0.1:8080/"]
#
# redirect_url 中必须包含实际公网端口:
# redirect_url = "https://service.example.com:8443/oauth2/callback"


# ------------------------------------------------------------
# 模式 C:Nginx auth_request,oauth2-proxy 不反代业务
# ------------------------------------------------------------
#
# http_address = "127.0.0.1:4180"
# reverse_proxy = true
# upstreams = ["static://202"]
# proxy_websockets = false
# set_xauthrequest = true
#
# Nginx:
#   /oauth2/*      -> oauth2-proxy
#   /oauth2/auth   -> oauth2-proxy
#   普通业务请求   -> 原业务上游


# ------------------------------------------------------------
# 模式 D:本地纯 HTTP 测试
# ------------------------------------------------------------
#
# http_address = "127.0.0.1:4180"
# redirect_url = "http://127.0.0.1:4180/oauth2/callback"
# cookie_secure = false
#
# 身份提供方中也必须登记完全相同的 HTTP Redirect URI。
#
# 此模式只适用于本地测试,不建议用于生产环境。


# ============================================================
# 十二、部署前检查单
# ============================================================

# [ ] 已替换 client_id
# [ ] 已替换 client_secret
# [ ] 已确认 oidc_issuer_url 与 Discovery issuer 完全一致
# [ ] 已在身份提供方登记 redirect_url
# [ ] redirect_url 使用用户实际访问的协议、域名和端口
# [ ] 已生成独立随机 cookie_secret
# [ ] 不同服务使用不同 cookie_name
# [ ] whitelist_domains 已填写实际业务域名
# [ ] upstreams 已指向正确业务服务
# [ ] HTTPS 上游证书验证配置正确
# [ ] 前面有代理时 reverse_proxy=true
# [ ] 公网 HTTPS 环境保持 cookie_secure=true
# [ ] 使用 session_cookie_minimal 时 cookie_refresh="0"
# [ ] 防火墙未将本机 HTTP 监听端口直接暴露到公网
# [ ] 健康检查使用 /ping
# [ ] 已执行 --config-test 验证配置

如此配置好后, 再次访问服务, 除了首次需要手动点击登录外, 大多服务商后续都会自动重定向. 嗯, 丝滑无感如不存在之物~

本站所有内容采用 CC BY-NC-SA 4.0 协议 进行许可
原文链接 https://blog.tomys.top/2026-07/oauth2-proxy/

评论

  1. 博主
    Windows Chrome
    1 分前
    2026-7-24 15:17:04

    好久没水过文章了

发送评论 编辑评论


				
OωO
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
(。•ˇ‸ˇ•。)
Source: github.com/DIYgod/OwO
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/lrhtony/BiliEmoji
Source: github.com/lrhtony/BiliEmoji
Source: github.com/lrhtony/BiliEmoji
Source: github.com/k4yt3x/flowerhd
OωO
Emoji
小恐龙
2233
小电视
hanser
花!
上一篇