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

把网站改造了一下,加入了 OAuth 登录,讨论下关于普通用户系统加入 OAuth 的问题

  •  
  •   KasuganoSoras ·
    kasuganosoras · 2019-02-03 09:55:34 +08:00 · 2723 次点击
    这是一个创建于 1906 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨晚爆肝了一下,给自己的网站加上了 Github OAuth 登录。

    现在可以通过 Github 账号登录了: https://www.natfrp.org/

    登录时点击左下角的基佬猫图标即可登录,无需手动设置账号、邮箱和密码。


    关于将普通用户系统改造加入 OAuth,我是这样做的:

    1. 因为我比较懒,不想再单独开个邮箱绑定页面,所以做了个判断,如果通过 Github OAuth 登录的用户没有 public email (即用户资料的 email 为 null ),就不允许注册
    2. 将 OAuth 用户的密码设置为 NULL,这样用户只能通过 OAuth 登录,因为系统做了判断,常规渠道无法通过空密码登录;用户也不能修改密码,因为旧密码不允许为空。

    现在虽然没啥问题,但是感觉还是不太完善。。而且这个设计只能 Github 登录,并不是真正的 OAuth 兼容。

    想问一下这种设计会有什么安全漏洞之类的吗?各位 V 友在处理 OAuth 登录的用户这方面有没有什么更好的办法呢?

    谢谢

    8 条回复    2019-02-03 14:57:24 +08:00
    henglinli
        1
    henglinli  
       2019-02-03 10:45:25 +08:00
    关于 public email 的问题,记得之前的 github 会提供一个 no replay 的伪邮件地址,现在不可选了,只能是 null。我目前特意将其设置为空。即使这样,我使用 github 账号登录 travis 也是没有问题的。按照你的说法,我的账号估计无法登录你的系统。有必要的话,你可以测试下这种情况。
    alvin666
        2
    alvin666  
       2019-02-03 10:49:09 +08:00 via Android
    我见过的网站里面,有的是强制 oauth 登陆以后再强制绑邮箱的,也有的是直接给你获取到的邮箱发邮件激活,也有的直接能用,要密码登陆得设密码
    我感觉都行,多和别人聊聊 /小黄鸭确定没有漏洞就行,一个人可能想的不完善
    KasuganoSoras
        3
    KasuganoSoras  
    OP
       2019-02-03 10:49:10 +08:00
    @henglinli #1 这个是因为邮箱是找回账号密码的唯一途径……所以我要求用户一定要提供一个真实有效的邮箱地址,在忘记密码的情况下只有通过邮箱找回,并且邮箱是不可修改的。
    henglinli
        4
    henglinli  
       2019-02-03 10:58:24 +08:00   ❤️ 1
    @KasuganoSoras 正好说到找回账号功能。我之前有忘记 github 密码的情况,github 提示我的密码不安全,有被撞库的风险。我就改了密码,恰好用的 chrome 自己生成的密码,遗憾的是我喜欢折腾,该密码未同步 chromebook 就被我重置了。之后发邮件给 GitHub 支持,他告诉我我还有一把 ssh key,后来从退役的本本上找到了这个 key,通过这个 key 把账号找回来了。找好所有权认定的方法有很多,我认为 ssh key 的方法很好。
    既然你喜欢折腾,建议支持 fido https://fidoalliance.org/
    henglinli
        5
    henglinli  
       2019-02-03 11:06:48 +08:00
    关于支持网络安全法已经反恐法:建议内置一个能获得所有账号所有权的内部邮件地址。
    为了更好的保护用户数据,实现账号删除功能是应该并且迫切的。至于保存规定时间的问题,我对数据库不熟悉,不过数据库应该有类似的功能实现,估计给个时间戳就可以了。(我在 GitHub 上看到过介绍中还有” time xxx “相关的数据库。)
    imbushuo
        6
    imbushuo  
       2019-02-03 11:10:06 +08:00   ❤️ 1
    不同的 IdP 发回来的 claim 当然也是不一样的,一般用固定的那个,比如 Active Directory 和 AAD 里一般用 Object ID 或者 UPN 都行

    我一般会存一下用户过来的 IdP 信息,甚至把本地登录也会拆成 SP + IdP (相当于自己也有一个 STS ),这样服务侧只需要接入 OAuth/OpenID Connect/SAML/WS-Trust 而不关心细节
    zanzhz1101
        7
    zanzhz1101  
       2019-02-03 14:29:06 +08:00
    522,你服务器挂了
    KasuganoSoras
        8
    KasuganoSoras  
    OP
       2019-02-03 14:57:24 +08:00
    @zanzhz1101 #7 刚刚把谷歌云结算账号删了重新激活,居然成功了,又白嫖了 $300
    所以网站临时挂了一会儿
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5417 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:57 · PVG 16:57 · LAX 01:57 · JFK 04:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.