应用的第三方认证,以及一方认证,不谈技术细节,只谈思路

yingShisscWang 2020-03-28 03:24:12
请教一个第三方认证的解决思路

前提:
有一个应用,它已经有一个自己的很标准的oauth2的认证服务, 同时它希望能够支持第三方的(比如微信)的oauth2登录。

场景:
用户在应用上用第三方的形式完成了登录。使用的模式为 Authoration code grant 模式。按照oauth的流程,最后应用端一定能够拿到第三方(微信)的一个access_token,并用这个access_token拿到用户在微信端的用户名,头像等等信息。完成了这个第三方的登录以后,应用会跳转到自己的页面上,接着要访问应用自己的api接口。但是这时候,应用还没有去拿自己的那个oauth提供的access_token


问题:
1)按正常的项目实际中的情况, 应用是不是要再去自己的那个oauth里再去认证一次,拿自己oauth的token?才能调用自己的api
2)如果上面这种成立,那么再去取自己的oauth token的时候,如果再一次弹出来输入用户名密码的页面怎么办?


另外我自己一直有一个理解,不知道对不对。
API能不能有权限访问完全是看access_token的,token合法就是可以调用。 这个和业务场景里的角色权限是没有关系的。即使用户什么权限也没有只要他能成功的登录到一个app里拿到合法token,那他就是可以调用这个oauth管理的所有接口的。
权限这些东西只用来控制页面显示和操作button,是从另一个维度去控制。
...全文
972 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
_沉浮_ 2020-04-02
  • 打赏
  • 举报
回复
1、先确定是是否微信端认证通过即本系统则认证通过 如果是这样,在微信认证完成后,我们进行一次本系统的内部认证,还是按照标准来,比如授权码模式,则先回去code再取token,这个在后台完成,当然里面会涉及到一些参数,比如用户名密码,我们既然人多微信认证过则系统认证成功,那么在sso认证服务器上可以做一些特殊的处理,也就是针对这种用户
一只三黄鸡 2020-03-31
  • 打赏
  • 举报
回复
我的理解:楼主应该是调用了类似微信第三方登录的接口,然后发现微信回调后,还需要自己的JWT体系去获得自己系统的token,以便于去解决用户在自己系统上的权限问题。

我先给你一些案例:很多APP或者网站,其实在微信这些第三方登录回调后,还会需要用户进行手机号码绑定,其实这也是为了解决类似你这样的问题,也就是让第三方的登录和我们自己的登录体系做一个中间表绑定,以便于后期用户的第二次登录以及自己系统用户体系的用户生成,我建议楼主其实也可以参考类似这样的方式

当然也可以直接使用第三方的登录体系,但是你需要记录下第三方的登录信息,包括头像,昵称,性别等,将它们作为一个新用户的方式去存储在你的数据库中,比如微信的openId作为唯一标识去作为登录的标识,一旦第三方登录回调成功,也同时意味着你的系统中的登录成功,直接生成自己所需的token(当然这样的方式好像有点不安全,要你按照自己实际情况)。当然同时在个人中心增加手机号的绑定功能,让客户可以通过手机号登录,也同时将第三方的客户转化为自己系统的客户。
yingShisscWang 2020-03-30
  • 打赏
  • 举报
回复
@流泪的熊猫 我大体能明白你的意思,只是我还没想通的是, 我在完成三方认证后,我要拿一方自己的oauth提供的token(为了调自己的api)。 这时候如果我再去一方oauth服务验证一次,不是又会再跳一次登录页吗?
流泪熊猫头 2020-03-29
  • 打赏
  • 举报
回复
引用 2 楼 yingShisscWang 的回复:
[quote=引用 1 楼 流泪熊猫头 的回复:] 按照我的理解,应该是这个应用账号可以绑定微信作为辅助登录方式。微信的oauth会返回id信息吧,微信那边验证通过了,再用这个id去查自己的库,如果有,那自己的应用后台直接返回一个access_token,没有的话提示未绑定账号,再跳至注册页。access_token是可以携带payload的,里面可以含有一些用户信息,可以参考JWT(Java Web Token),所以是可以用token来做角色权限校验的。如果是任意用户可以调用,那么我为何还需要登录呢 API调用可不仅仅只在页面上才可以操作,用postman等工具也可以做到。
@流泪熊猫头 我理解一下你的意思: 在拿到微信端的openid以后,应用再到自己后端的用户表里查询一下,确认这个openid有没有一条现在关联着的用户记录。如果有关联的记录,应用端完成登录动作。后面是分歧点:(前提,应用的后端和oauth服务是2个东西) 1)同时应用要给自己原来的那个oauth认证服务发一个请求,要求它返回一个accesstoken 2)应用自己的后端代码里生成一个accesstoken 如果是2, 那这样生成的token,在api调用鉴权的时候能通过吗?鉴权需要token包括哪些信息 [/quote]token是无状态的,只要在有效期内都是有效的。后端拦截请求,验证token,先看有没有过期,再看调用相关接口是否有权限。token可以携带任何信息,都是被对称加密过的,后端解密就能提取,因此可以添加用户信息,比如id、角色信息,往往权限也是被赋予角色的,此时就可以根据角色来判断是否有权限。你的后台应该只接受自己的oauth服务器返回的token吧,可以自己的后台去获取token然后再返回给前台,oauth服务一般是需要提供账号密码的,因此交给后台去查会方便些。
yingShisscWang 2020-03-29
  • 打赏
  • 举报
回复
引用 1 楼 流泪熊猫头 的回复:
按照我的理解,应该是这个应用账号可以绑定微信作为辅助登录方式。微信的oauth会返回id信息吧,微信那边验证通过了,再用这个id去查自己的库,如果有,那自己的应用后台直接返回一个access_token,没有的话提示未绑定账号,再跳至注册页。access_token是可以携带payload的,里面可以含有一些用户信息,可以参考JWT(Java Web Token),所以是可以用token来做角色权限校验的。如果是任意用户可以调用,那么我为何还需要登录呢 API调用可不仅仅只在页面上才可以操作,用postman等工具也可以做到。
@流泪熊猫头 我理解一下你的意思: 在拿到微信端的openid以后,应用再到自己后端的用户表里查询一下,确认这个openid有没有一条现在关联着的用户记录。如果有关联的记录,应用端完成登录动作。后面是分歧点:(前提,应用的后端和oauth服务是2个东西) 1)同时应用要给自己原来的那个oauth认证服务发一个请求,要求它返回一个accesstoken 2)应用自己的后端代码里生成一个accesstoken 如果是2, 那这样生成的token,在api调用鉴权的时候能通过吗?鉴权需要token包括哪些信息
流泪熊猫头 2020-03-28
  • 打赏
  • 举报
回复
按照我的理解,应该是这个应用账号可以绑定微信作为辅助登录方式。微信的oauth会返回id信息吧,微信那边验证通过了,再用这个id去查自己的库,如果有,那自己的应用后台直接返回一个access_token,没有的话提示未绑定账号,再跳至注册页。access_token是可以携带payload的,里面可以含有一些用户信息,可以参考JWT(Java Web Token),所以是可以用token来做角色权限校验的。如果是任意用户可以调用,那么我为何还需要登录呢 API调用可不仅仅只在页面上才可以操作,用postman等工具也可以做到。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧