• 请不要在回答技术问题时复制粘贴 AI 生成的内容
DoUSeeMe
V2EX  ›  程序员

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

  •  
  •   DoUSeeMe · Apr 24, 2020 · 4375 views
    This topic created in 2229 days ago, the information mentioned may be changed or developed.

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

    前提:

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

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

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

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

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

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

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