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

oauth2.0 授权码登录后,是如何和应用进行交互的?

  •  
  •   jimmyismagic · 2020-10-13 20:56:15 +08:00 · 1674 次点击
    这是一个创建于 1290 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如授权 qq 登录后,我要发帖,通过什么方式应用知道我是我的?

    10 条回复    2020-10-14 11:25:18 +08:00
    weitch
        1
    weitch  
       2020-10-13 21:02:46 +08:00
    授权后给你返回一个 code,用 code 后台去请求用户信息。
    jimmyismagic
        2
    jimmyismagic  
    OP
       2020-10-13 21:09:34 +08:00
    @weitch 我是是登录后,用户信息都请求到了,然后用户要发帖,这时候和 qq 登录没任何关系了
    qiayue
        3
    qiayue  
       2020-10-13 21:16:55 +08:00
    你用 QQ 登录授权给 A 应用后,QQ 给 A 一个 code,A 拿着 code 去问 QQ 要你的信息,里边包含了一个 openid,就可以唯一代表你。
    A 一般会拿着你的 openid 去自己数据库查一查,是否有相关用户,如果有,就得到了你的 user_id,如果没有,就用 openid 去注册一个新用户,也会生成一个 user_id 。
    最后你去发帖,帖子表保存了你的 user_id 。
    jimmyismagic
        4
    jimmyismagic  
    OP
       2020-10-13 21:30:23 +08:00
    @qiayue 但是发帖的时候,A 应用如何知道是我发的贴,交互的时候是有 cookie 还是其他信息?还是要再向 A 应用申请一个 token ?
    Xusually
        5
    Xusually  
       2020-10-13 21:33:38 +08:00
    @jimmyismagic #3 说的很清楚了,你在 A 应用发帖,用的是 A 应用的用户身份,鉴权从 OpenID 登录到 A 应用之后,就是 A 应用用自己的用户逻辑去处理了,你发帖肯定是 A 应用用自己系统的用户标示去匹配的你,至于是用的 cookie 还是用 A 应用自己的 url token,header 里面放 jwt 之类的,看具体实现。
    jimmyismagic
        6
    jimmyismagic  
    OP
       2020-10-13 21:38:23 +08:00
    你发帖肯定是 A 应用用自己系统的用户标示去匹配的你,至于是用的 cookie 还是用 A 应用自己的 url token,header 里面放 jwt 之类的,看具体实现。

    @Xusually 这一步是什么时候发生的呢?用户是如何得到访问 A 应用的 jwt 的呢?
    Xusually
        7
    Xusually  
       2020-10-13 21:50:17 +08:00
    @jimmyismagic 你用 qq 登录的时候,qq 登录完成后会回调或者跳转到 A 应用的一个页面,A 应用可以在这个页面里给你种 cookie,加 url token,放 header
    freakxx
        8
    freakxx  
       2020-10-13 21:53:24 +08:00
    你这个问题可以拆成 2 个

    项目系统怎么知道,该用户是“我”, 阅读 auth + 登陆系统的资料可知;
    oauth 第三方 怎么让你知道这个人是谁,返回一个可查询的 token,让你去获取这个人资料

    回到你的问题
    你应该认真去看下原理以及认真看下请求流程图;

    流程大概可以是
    用户访问你页面 --- 跳到 QQ 鉴权页面 --- QQ 带回一个 code --- 你用这个 code 通过一定的方式获取了一个唯一的值,无论它叫 uid 也好,openid 也好,qq 也好 ---- 取回你的系统

    拿着这个值,去查表,查到之后,转换成你鉴权的方式,token 也好,就算你返回 123 也好,每次你鉴权看到这个值,就代表是这个用户。


    在上面这堆话里面,都是每个 oauth 写烂的东西,
    拆成 3 个基本问题就是
    怎么从第三方拿到一个唯一值
    怎么把这个唯一值跟你系统的用户联系起来
    知道用户之后,返回什么让他可以通过项目鉴权系统
    eason1874
        9
    eason1874  
       2020-10-13 21:56:48 +08:00
    用户点击 QQ 登录 -> 进入 QQ 授权页面 -> 确认登录后回调跳转到你的网站 -> 你的网站拿到回调 code 参数,通过 QQ 接口获取用户唯一 openid,拿到 openid 后查询数据库有没有对应用户 -> 有就进行登录,没有就转到注册

    能拿到 openid 就说明用户授权登录了,相当于用户输入账户密码并验证通过了,接下来的登录步骤是一样的,就是写 cookie 什么的
    lori01
        10
    lori01  
       2020-10-14 11:25:18 +08:00
    你问题问错了,实际上想问《我在浏览器发了一个帖子,服务端如何知道是我发的》
    一个登录框架,实际上是分为认证和授权 2 部分。
    认证:你网站使用 QQ 登录,那么认证就是 QQ 帮你做的,至于如何做,上面很多人都解释了
    授权:你得自己绑定自己的用户后自己实现自己的授权逻辑

    比如 shiro 框架,qq 登录后,返回 code 和用户信息,你需要在自己系统里面创建一个用户来绑定 qq,并且进行自动登录,使用 shiro 可以实现无密码自动认证和授权,shiro 认证后,会产生一个 jessionid 发给客户端(浏览器),浏览器保存在 cookie 中,当你浏览器请求服务端时,会带上这个 cookie,shiro 框架取到这个 cookie 后,经过判断 jessionid 有效,即浏览器已登录用户
    至于如何知道谁登录的,shiro 的认证方法可以重构,一般也需要自己重构。认证方法在认证完成后,可以往 session 写入用户信息,当页面请求服务端时,controller 或 service 可以获取这个用户 session,就知道当前操作用户是谁了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5763 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 02:19 · PVG 10:19 · LAX 19:19 · JFK 22:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.