前后端分离的页面在请求第三方授权时如何保证授权 token 可以绑定到当前账号 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
DoUSeeMe
V2EX    程序员

前后端分离的页面在请求第三方授权时如何保证授权 token 可以绑定到当前账号

  •  
  •   DoUSeeMe 2020 年 4 月 24 日 4266 次点击
    这是一个创建于 2167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一定要认真地看下我的前提,一定要认真地看下我的前提,一定要认真地看下我的前提!!!

    前提:

    • 前后端分离的页面请求第三方授权,也就是使用页面本身使用 jwt 鉴权然后另外请求第三方授权
    • 请求授权的第三方 url 固定
    • 第三方授权回调的 url 不允许带有 query,如果使用 domain/auth/id_123 这种回调格式可行,但需要在第三方的后台去一个个填写地址,这显然不能实现
    • 不使用 Session
    • 第三方不提供给回调同时返回的可设置的变量

    问题:如当前的用户 A 需要请求第三方授权,获取第三方授权后返回的 token 该如何确定是 A 发出的请求授权?

    28 条回复    2020-04-26 10:41:06 +08:00
    fancy111
        1
    fancy111  
       2020 年 4 月 24 日
    有 token 了还需要前提? 自己写算法,把 A 的特征写进去,生成 token
    index90
        2
    index90  
       2020 年 4 月 24 日
    token 有签名的啊,根据数字签名验证是不是 A 发出的。
    chmaple
        3
    chmaple  
       2020 年 4 月 24 日
    去了解一下 Oauth2 的机制吧,ticket 的作用就是你这个。
    b821025551b
        4
    b821025551b  
       2020 年 4 月 24 日
    主要取决于这个授权流程是怎样的;
    1 、用户主动请求授权,有 UI 操作的,那么授权完成后应该回到你们自己的页面并带上 token,这时候前端拿着 token 和你们的 token 去和你们的后端交换数据;
    2 、如果是静默授权,回调地址是你们服务器,这时候第三方应该会给出除 token 外其它参数,具体看他们文档。
    DoUSeeMe
        5
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @fancy111
    @index90

    不知道是不是我表述的不够清楚,第三方授权不需要我传任何值给他,除了 return url,用户在完成第三方授权后会 POST 回调 return url 并传值。所以我只要赋值了第三方授权的地址,在任何地方打开授权都时可以的,问题是在于授权后如何判断 POST 回来的 token (第三方返回的 token 不会有任何标记) 是这个用户发出的
    DoUSeeMe
        6
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @b821025551b 第三方授权不需要我传任何值给他,除了 return url,用户在完成第三方授权后会 POST 回调 return url 并传值。所以我只要给授权 url 赋值回调地址,在任何地方打开去授权都时可以的,问题是在于授权后如何判断 POST 回来的 token (第三方返回的 tken 不会有任何标记) 是这个用户发出的。

    也就是说发出时不允许有任何标记,返回时不会有任何标记,如果有 Session 那么问题就简单了,但是目前的情况不允许使用 Session
    b821025551b
        7
    b821025551b  
       2020 年 4 月 24 日
    @DoUSeeMe #6 按你的描述是无解的,不过我觉得作为一个三方平台不会搞成这样,有公开文档么,闲着无聊看看。
    telami
        8
    telami  
       2020 年 4 月 24 日
    跟楼上
    不需要这么隐晦,第三方授权如果是登录的话,无非微信、支付宝这些登录啥的,可以发出来看看,这些都做过的
    DoUSeeMe
        9
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @b821025551b paypal 就是了。。
    KuroNekoFan
        11
    KuroNekoFan  
       2020 年 4 月 24 日
    oauth 啊
    DoUSeeMe
        12
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @KuroNekoFan 啊啊啊~看#6
    b821025551b
        13
    b821025551b  
       2020 年 4 月 24 日
    @DoUSeeMe #10 这不是有个 redirect_uri 么。。。The URI of the page to which PayPal will redirect the merchant after they have granted you permission to process transactions on their behalf
    blessyou
        14
    blessyou  
       2020 年 4 月 24 日
    第三方授权登录没那么麻烦。
    1. 用户点击授权登录按钮, 跳转到第三方。
    2. 第三方判断用户授权, 给一个只能使用一次的 code 并且拼接到 return_uri 的 querystring 。
    3. 前端 return_uri 页面 读取 querystring 上的 code 参数值 请求后端服务 api 。
    4. 后端拿前端传来的 code 获取第三方授权信息, 后端拿你请求带上的 Token 凭证获取信息。
    5. 后端判断 是否拿到了授权信息,拿到了授权判断是否绑定过,没绑定,就绑定成功。其余情况都是绑定失败。

    基本就是这个逻辑吧。
    huijiewei
        15
    huijiewei  
       2020 年 4 月 24 日
    第三方调用是不可能不给带 query 的,你的前提条件不存在

    你发出来文档,我看看哪个第三方 API 这么牛逼
    oott123
        16
    oott123  
       2020 年 4 月 24 日 via Android
    存 sessionStorage 里,后端不读,你读出来一起发给后端
    DoUSeeMe
        17
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @huijiewei 很明显 Paypal 就是这样的存在
    DoUSeeMe
        18
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @b821025551b #13 redirect_uri 不许带 query 啊啊啊啊~~~
    huijiewei
        19
    huijiewei  
       2020 年 4 月 24 日 via iPhone
    @DoUSeeMe 发文档
    mxT52CRuqR6o5
        20
    mxT52CRuqR6o5  
       2020 年 4 月 24 日 via Android
    @DoUSeeMe 是文档里说不许带还是你测试下来不行?如果是后者大概率是你用的有问题
    DoUSeeMe
        21
    DoUSeeMe  
    OP
       2020 年 4 月 24 日
    @mxT52CRuqR6o5 文档没说不许带,不过我就算是只加了个 “?” 在 url 后面,PayPal 就会报错 redirect_uri 格式无效
    huijiewei
        22
    huijiewei  
       2020 年 4 月 24 日
    @DoUSeeMe redirect_uri url_encode 没有
    lewinlan
        23
    lewinlan  
       2020 年 4 月 25 日 via Android
    不许带 query,不用问号不就得了?
    用斜杠划分 token 呗
    index90
        24
    index90  
       2020 年 4 月 25 日
    所以用第三方登录的时候,从第三方鉴权回来后,要么自动给你创建一个以第三方账号 id 作为用户 id 的本地账号。要么走注册流程,要求用户输入邮箱等信息。要么用户提前在配置页绑定好第三方账号。
    blessyou
        25
    blessyou  
       2020 年 4 月 25 日
    @DoUSeeMe #21 .... 你可以去一下我的网站的第三方登录按钮的信息,我看了 PayPal 的文档 和 Google Github 的一模一样。你文档没看懂而已。https://happysooner.com/login-and-register
    b821025551b
        26
    b821025551b  
       2020 年 4 月 26 日
    @DoUSeeMe #21 redirect_uri 是你提供给第三方回调的地址,当然不需要你去加 query 并且不可提供 query 啊,query 内容是第三方返回给你的。。。
    DoUSeeMe
        27
    DoUSeeMe  
    OP
       2020 年 4 月 26 日
    @huijiewei 肯定有的
    NoKey
        28
    NoKey  
       2020 年 4 月 26 日
    马一个,围观
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2793 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 15:40 PVG 23:40 LAX 08:40 JFK 11:40
    Do have faith in what you're doing.
    ubao msn 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