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

2020-10-13 20:56:15 +08:00
 jimmyismagic

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

1785 次点击
所在节点    程序员
10 条回复
weitch
2020-10-13 21:02:46 +08:00
授权后给你返回一个 code,用 code 后台去请求用户信息。
jimmyismagic
2020-10-13 21:09:34 +08:00
@weitch 我是是登录后,用户信息都请求到了,然后用户要发帖,这时候和 qq 登录没任何关系了
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
2020-10-13 21:30:23 +08:00
@qiayue 但是发帖的时候,A 应用如何知道是我发的贴,交互的时候是有 cookie 还是其他信息?还是要再向 A 应用申请一个 token ?
Xusually
2020-10-13 21:33:38 +08:00
@jimmyismagic #3 说的很清楚了,你在 A 应用发帖,用的是 A 应用的用户身份,鉴权从 OpenID 登录到 A 应用之后,就是 A 应用用自己的用户逻辑去处理了,你发帖肯定是 A 应用用自己系统的用户标示去匹配的你,至于是用的 cookie 还是用 A 应用自己的 url token,header 里面放 jwt 之类的,看具体实现。
jimmyismagic
2020-10-13 21:38:23 +08:00
你发帖肯定是 A 应用用自己系统的用户标示去匹配的你,至于是用的 cookie 还是用 A 应用自己的 url token,header 里面放 jwt 之类的,看具体实现。

@Xusually 这一步是什么时候发生的呢?用户是如何得到访问 A 应用的 jwt 的呢?
Xusually
2020-10-13 21:50:17 +08:00
@jimmyismagic 你用 qq 登录的时候,qq 登录完成后会回调或者跳转到 A 应用的一个页面,A 应用可以在这个页面里给你种 cookie,加 url token,放 header
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
2020-10-13 21:56:48 +08:00
用户点击 QQ 登录 -> 进入 QQ 授权页面 -> 确认登录后回调跳转到你的网站 -> 你的网站拿到回调 code 参数,通过 QQ 接口获取用户唯一 openid,拿到 openid 后查询数据库有没有对应用户 -> 有就进行登录,没有就转到注册

能拿到 openid 就说明用户授权登录了,相当于用户输入账户密码并验证通过了,接下来的登录步骤是一样的,就是写 cookie 什么的
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,就知道当前操作用户是谁了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/714626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX