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

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

  •  
  •   DoUSeeMe · 2020-04-24 16:00:04 +08:00 · 3466 次点击
    这是一个创建于 1435 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    前提:

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

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

    也就是说发出时不允许有任何标记,返回时不会有任何标记,如果有 Session 那么问题就简单了,但是目前的情况不允许使用 Session
    b821025551b
        7
    b821025551b  
       2020-04-24 16:35:45 +08:00
    @DoUSeeMe #6 按你的描述是无解的,不过我觉得作为一个三方平台不会搞成这样,有公开文档么,闲着无聊看看。
    telami
        8
    telami  
       2020-04-24 16:45:02 +08:00
    跟楼上
    不需要这么隐晦,第三方授权如果是登录的话,无非微信、支付宝这些登录啥的,可以发出来看看,这些都做过的
    DoUSeeMe
        9
    DoUSeeMe  
    OP
       2020-04-24 17:09:20 +08:00
    @b821025551b paypal 就是了。。
    KuroNekoFan
        11
    KuroNekoFan  
       2020-04-24 17:17:24 +08:00
    oauth 啊
    DoUSeeMe
        12
    DoUSeeMe  
    OP
       2020-04-24 17:19:23 +08:00
    @KuroNekoFan 啊啊啊~看#6
    b821025551b
        13
    b821025551b  
       2020-04-24 17:19:25 +08:00
    @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-04-24 17:21:28 +08:00
    第三方授权登录没那么麻烦。
    1. 用户点击授权登录按钮, 跳转到第三方。
    2. 第三方判断用户授权, 给一个只能使用一次的 code 并且拼接到 return_uri 的 querystring 。
    3. 前端 return_uri 页面 读取 querystring 上的 code 参数值 请求后端服务 api 。
    4. 后端拿前端传来的 code 获取第三方授权信息, 后端拿你请求带上的 Token 凭证获取信息。
    5. 后端判断 是否拿到了授权信息,拿到了授权判断是否绑定过,没绑定,就绑定成功。其余情况都是绑定失败。

    基本就是这个逻辑吧。
    huijiewei
        15
    huijiewei  
       2020-04-24 17:35:50 +08:00
    第三方调用是不可能不给带 query 的,你的前提条件不存在

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