V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moonrailgun
V2EX  ›  程序员

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

  •  1
     
  •   moonrailgun ·
    moonrailgun · 2023-07-12 00:46:43 +08:00 · 3040 次点击
    这是一个创建于 512 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    8 条回复    2023-07-12 15:58:13 +08:00
    oneisall8955
        1
    oneisall8955  
       2023-07-12 01:04:42 +08:00 via Android
    tailchat 调用 github 或 google 的 oauth ,用 code 获取 access token ,然后调 api 获取用户信息进行登录绑定用户?其中被墙了是不是?
    moonrailgun
        2
    moonrailgun  
    OP
       2023-07-12 01:16:08 +08:00 via Android
    @oneisall8955 很懂嘛,是的。辣鸡 gfw
    SolarHurricane
        3
    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
        4
    oneisall8955  
       2023-07-12 10:37:27 +08:00   ❤️ 2
    我也遇到这个问题,由于工作原因,对接了很多国外第三方社媒平台。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
        5
    oneisall8955  
       2023-07-12 10:41:13 +08:00
    @oneisall8955 #4 这里 worker.js 主要添加了 checkCustomUrl 方法,并且使用 customProxyDomainArray 作为白名单,这是一个正则搜索,按需修改搭配使用即可
    moonrailgun
        6
    moonrailgun  
    OP
       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
        7
    SolarHurricane  
       2023-07-12 15:08:11 +08:00
    @moonrailgun 感谢回复。看了下代码应该没问题。GitHub 的 OAuth 不支持 OpenID Connect ,所以只能先获取 access token 再获取用户信息。不过我好奇,让用户跳转到 Github 登录的时候,需要提供 scope(read, write 啥的),这个 scope 是在哪里定义的?你给的链接里好像没有。
    moonrailgun
        8
    moonrailgun  
    OP
       2023-07-12 15:58:13 +08:00
    @SolarHurricane 默认就是获取基础配置,如果要额外的可以再加
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 19:38 · PVG 03:38 · LAX 11:38 · JFK 14:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.