关于我不得不给国外开发者解释为什么我的 OAuth 登录会超时的问题

2023-07-12 00:46:43 +08:00
 moonrailgun

google 根本是不用想,github 还可以靠运气。

3032 次点击
所在节点    程序员
8 条回复
oneisall8955
2023-07-12 01:04:42 +08:00
tailchat 调用 github 或 google 的 oauth ,用 code 获取 access token ,然后调 api 获取用户信息进行登录绑定用户?其中被墙了是不是?
moonrailgun
2023-07-12 01:16:08 +08:00
@oneisall8955 很懂嘛,是的。辣鸡 gfw
SolarHurricane
2023-07-12 04:17:32 +08:00
借楼问下 OAuth 的问题。你图中的 repo 应用是通过 OAuth 的 OpenID Connect 实现第三方登录吗?能否给一下 repo 链接学习一下。

另外,想问下 auth server ( github )的`/userinfo` endpoint 有什么用吗?我看获取的 ID Token 里,附带的信息和/userinfo 返回的一样?

最后,如果只是通过 OAuth 做第三方登录的话,我的应用似乎只需要 ID Token ,不需要 access token/refresh token ?仅从 ID Token 我就可以完成新用户注册/老用户读取( authentication )。
oneisall8955
2023-07-12 10:37:27 +08:00
我也遇到这个问题,由于工作原因,对接了很多国外第三方社媒平台。qa 环境在国内主机,被墙了,运维说 qa 环境因为历史原因不方便搭建 VPN 或代理。

我是这样解决的:

- 第三方 api 链接做成可配置的,也就是根据 dev/qa/pre/prod 环境配置
- 搭建免费的 api 中转,(感谢 cloudflare 的免费 worker )最大的工作量在此。搭建类似 https://ghproxy.com 这样的加速服务。

例如 api 原本是 https://oauth2.example.com/token
搭配这个服务的加速链接为 https://ghproxy.com/https://oauth2.example.com/token
这样原本被墙的 api 链接经过了服务进行了中转

- 修改自己项目各个环境的 api ,按需加上前缀即可,例如 qa 环境在国内网络被墙就加上,生产环境在国外就保持原来的链接

如何搭建? ghproxy 的项目对应的源码: https://github.com/hunshcn/gh-proxy

原项目只能用于加速 github ,需要魔改源码,去除限制或添加上白名单即可,并且,可通过 cloudflare worker 免费搭建,只需要绑定一个未被墙的域名即可。

按照 readme 指导 worker 版本搭建好后,可参考的修改如下,太长了粘贴在 pastebin: https://pastebin.com/h8E9gcyD
oneisall8955
2023-07-12 10:41:13 +08:00
@oneisall8955 #4 这里 worker.js 主要添加了 checkCustomUrl 方法,并且使用 customProxyDomainArray 作为白名单,这是一个正则搜索,按需修改搭配使用即可
moonrailgun
2023-07-12 14:02:49 +08:00
@SolarHurricane 我是按照自己理解做的第三方登录,通过重定向过来的 code 换取临时的 access token 再换取用户信息,用用户信息匹配用户进行登录(没有匹配则自动注册)。
大致的操作就是达到一个通过第三方平台的 id 映射到自己平台的 id 实现一个无密码登录的操作。
这里是相关的实现连接可供参考,如果我写的不是正经实现方案也欢迎指出讨论,我想了一圈应该是没有安全问题的
https://github.com/msgbyte/tailchat/blob/master/server/plugins/com.msgbyte.iam/strategies/github.ts
https://github.com/msgbyte/tailchat/blob/master/server/plugins/com.msgbyte.iam/services/iam.service.ts


@oneisall8955 通过代理转发肯定能实现操作,但是我考虑到两点:
- 如果用在正式服务上可靠性减半,因为增加了中间环节,而且还需要维护中转节点
- 本来 https 可以保护数据不被篡改,中间加了一层以后出现了安全隐患。

不过你这个方案我学会了,并且打算用一波。因为我后面还打算接入 google 登录。github 还时不时能脸上 google 就真的没办法直连了。感谢大佬分享
SolarHurricane
2023-07-12 15:08:11 +08:00
@moonrailgun 感谢回复。看了下代码应该没问题。GitHub 的 OAuth 不支持 OpenID Connect ,所以只能先获取 access token 再获取用户信息。不过我好奇,让用户跳转到 Github 登录的时候,需要提供 scope(read, write 啥的),这个 scope 是在哪里定义的?你给的链接里好像没有。
moonrailgun
2023-07-12 15:58:13 +08:00
@SolarHurricane 默认就是获取基础配置,如果要额外的可以再加

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX