使用 Google 的 oauth 方式登录,获取的 id token 中的 sub 是全局唯一的么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhwguest
V2EX  &nbs; Google

使用 Google 的 oauth 方式登录,获取的 id token 中的 sub 是全局唯一的么?

  •  
  •   zhwguest 2023-09-10 17:03:36 +08:00 2133 次点击
    这是一个创建于 761 天前的主题,其中的信息可能已经有所发展或是发生改变。

    参见链接: https://developers.google.com/identity/openid-connect/openid-connect#an-id-tokens-payload

    这里面有一个例子:

    "sub": "10769150350006150715113082367", 

    请问同一个 Google 用户,针对不同的开发者,这个 sub 是相同的么?

    我知道微信的三方登录中,对同一个微信用户,不同的开发者看到的 UnionID 是不一样的。

    Google 是怎么考虑这个事情的呢?

    9 条回复    2023-09-11 14:24:16 +08:00
    darkengine
        1
    darkengine  
       2023-09-10 20:39:07 +08:00
    确实是唯一的, 同一个 google account, 不同 app 登录成功后拿到的 sub 一样
    bing1178
        2
    bing1178  
       2023-09-10 21:54:57 +08:00
    肯定不一样。 不然我授权 A 站点的 token 。假设 token 被泄露了,拿这个 token 传给 b 站点 b 站点也能认证通过的,这样不安全。

    我记得每个商户就是验证的这个 sub
    zhwguest
        3
    zhwguest  
    OP
       2023-09-10 23:00:53 +08:00
    @bing1178 这是两个概念吧。A 站点的 Token ,B 站点的确能够验证,但是 Google 的文档一直在强调,一定要检查 token 中的 aud 是不是自己的应用(就是说 B 站点不要用 aud 为 A 的 token 来验证)。
    https://developers.google.com/identity/openid-connect/openid-connect?hl=zh-cn#validatinganidtoken

    但是我目前读到的文档都是 sub 是全局唯一的,没有任何地方说名不同的 aud 有不同的 sub 。
    zhwguest
        4
    zhwguest  
    OP
       2023-09-10 23:03:24 +08:00
    @darkengine 这样觉得好危险啊,不知道怎么想的,做点隔离不好么?
    darkengine
        5
    darkengine  
       2023-09-10 23:25:30 +08:00
    @zhwguest 我是帮朋友维护两个 app 的时候发现的 sub 是唯一的. 除非你连自己 app 的 account token 都泄露了, 才能让别人拿到你 app 能访问到被这个 Google account 授权你能获取的数据.

    再者我们的 app 在登录成功之后的所有请求都是通过自己的 token 鉴权的, 不会再传 sub.

    如果同一个公司有多个 app 都支持 google account 登录, 那么这个唯一 sub 还是有好处的, 例如可以让用户在不同的 app 上共用数据
    summerwar
        6
    summerwar  
       2023-09-11 06:35:43 +08:00
    google 的 sub ,同一个用户是一样的,这样可以实现跨网站标识同一个用户

    微信里获取的每个应用(公众号或小程序)下的 openid 是一样的,但是存在一个企业开发多个应用或者有多个公众号的情况,所以又弄了一个 unionID ,需要把这些公众号和小程序绑定在一起,这样能获取到相同的 unionID ,可以标识同一个用户。

    google openid 就是一个登陆账号的,所以不会设计的很复杂,而且你即使拿到 sub ,除了验证同一个邮箱的是同一个用户,其他的并不能做什么
    8rmEHZ8WhVHVOb0E
        7
    8rmEHZ8WhVHVOb0E  
       2023-09-11 09:24:52 +08:00
    微信之所以分开,就是为了防止开发者识别到这是一个用户,美名曰保护用户隐私,其实就是把用户牢牢抓在自己平台上,比如抖音这种被微信 QQ 停止了授权,就一点办法没有。而 google 本身垄断意愿就低,没有必要分开整那么麻烦,如果 Google 停止了 tiktok 的授权,tiktok 重新授权一个 oauth2 开发者账号就又可以继续登录了,所有 google 这种做法是比较通用的,也对开发者有好处
    baobao1270
        8
    baobao1270  
       2023-09-11 10:54:32 +08:00
    我觉得不应该用 JWT 里的东西去标识用户吧。如果需要获得用户的唯一 ID ,还是建议走 userinfo 接口。
    Oktfolio
        9
    Oktfolio  
       2023-09-11 14:24:16 +08:00   1
    4.1.2. "sub" (Subject) Claim

    The "sub" (subject) claim identifies the principal that is the
    subject of the JWT. The claims in a JWT are normally statements
    about the subject. The subject value MUST either be scoped to be
    locally unique in the context of the issuer or be globally unique.
    The processing of this claim is generally application specific. The
    "sub" value is a case-sensitive string containing a StringOrURI
    value. Use of this claim is OPTIONAL.

    https://www.rfc-editor.org/rfc/rfc7519#section-4.1.2

    要么同一个 issuer 唯一,要么全局唯一,这里 issuer 都是 google ,所以是唯一的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2842 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 14:07 PVG 22:07 LAX 07:07 JFK 10:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86