Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

中间件授权snsapi_base后,不能再次授权snsapi_userinfo #289

Closed
qq447665722 opened this issue Dec 19, 2018 · 22 comments
Closed

中间件授权snsapi_base后,不能再次授权snsapi_userinfo #289

qq447665722 opened this issue Dec 19, 2018 · 22 comments

Comments

@qq447665722
Copy link

抄了一下以下链接这位哥的代码,发现如果用户自动登录后,再让他授权登录就不会跳转到授权界面了?
https://blog.csdn.net/AIkiller/article/details/79556563
调用了/login,保持session的情况下,再次调用/register就不会跳转授权界面了,怎么才能正常授权跳转?

环境
laravel 5.7
laravel-wechat 4.0.22

@qq447665722
Copy link
Author

目前解决办法: 登录过程判断是新用户,手动清除用户数据session再跳转注册流程

@overtrue
Copy link
Owner

任何授权都是第一次会弹授权界面,所以你根本就不需要切换,一直用 snsapi_userinfo 就好了。

@qq447665722
Copy link
Author

任何授权都是第一次会弹授权界面,所以你根本就不需要切换,一直用 snsapi_userinfo 就好了。

snsapi_base好像不需要弹出授权界面呀,但只能获取到openid咯
session过期后还一直使用snsapi_userinfo作为登录中间件,微信就会再次弹出授权界面了
我只是想注册时弹出授权界面,之后的登录过程就无感登录
看到2016年的一条issues,解决过这个问题,但我用的是最新的代码
#50
@overtrue

@bolechen
Copy link

任何授权都是第一次会弹授权界面,所以你根本就不需要切换,一直用 snsapi_userinfo 就好了。

snsapi_base好像不需要弹出授权界面呀,但只能获取到openid咯
session过期后还一直使用snsapi_userinfo作为登录中间件,微信就会再次弹出授权界面了
我只是想注册时弹出授权界面,之后的登录过程就无感登录
看到2016年的一条issues,解决过这个问题,但我用的是最新的代码
#50
@overtrue

你是公众号吗?如果关注了就不会弹了吧

@colder-winter
Copy link

任何授权都是第一次会弹授权界面,所以你根本就不需要切换,一直用 snsapi_userinfo 就好了。

snsapi_base好像不需要弹出授权界面呀,但只能获取到openid咯
session过期后还一直使用snsapi_userinfo作为登录中间件,微信就会再次弹出授权界面了
我只是想注册时弹出授权界面,之后的登录过程就无感登录
看到2016年的一条issues,解决过这个问题,但我用的是最新的代码
#50
@overtrue

此问题仍然存在,题主的关于无感登录的需求很实际,这里要是能做一下优化的话,实在是好极了

@almas1992
Copy link

almas1992 commented Apr 23, 2019

此问题仍然存在,题主的关于无感登录的需求很实际,这里要是能做一下优化的话,实在是好极了

做优化?授权弹窗不是这个包能控制的吧?只获取openid不需要授权,可获取全部信息每隔一段时间得重新授权的

@bolechen
Copy link

此问题仍然存在,题主的关于无感登录的需求很实际,这里要是能做一下优化的话,实在是好极了

做优化?授权弹窗不是这个包能控制的吧?只获取openid不需要授权,可获取全部信息每隔一段时间得重新授权的

楼主的意思应该是第一次弹窗用 snsapi_userinfo,获取到全部信息后,后面用户再次访问用 snsapi_base ,静默授权吧,这个时候已经拿到信息了,只需要 openid 确认身份就行了

@colder-winter
Copy link

此问题仍然存在,题主的关于无感登录的需求很实际,这里要是能做一下优化的话,实在是好极了

做优化?授权弹窗不是这个包能控制的吧?只获取openid不需要授权,可获取全部信息每隔一段时间得重新授权的

题主的方案是:
1、用户第一次登录时,使用snsapi_userinfo授权方式(需弹窗)获取用户信息,并注册
2、以后用户来访时,使用snsapi_base获取openid(不需弹窗),实现无感登录
3、这个方案就只需要用户授权一次,以后再也不需要用户授权了

@overtrue
Copy link
Owner

overtrue commented Apr 23, 2019 via email

@colder-winter
Copy link

那么根据什么来判断用户是不是首次登陆呢? ColderWinter [email protected]于2019年4月23日 周二下午4:19写道:

此问题仍然存在,题主的关于无感登录的需求很实际,这里要是能做一下优化的话,实在是好极了 做优化?授权弹窗不是这个包能控制的吧?只获取openid不需要授权,可获取全部信息每隔一段时间得重新授权的 题主的方案是: 1、用户第一次登录时,使用snsapi_userinfo授权方式(需弹窗)获取用户信息,并注册 2、以后用户来访时,使用snsapi_base获取openid(不需弹窗),实现无感登录 3、这个方案就只需要用户授权一次,以后再也不需要用户授权了 — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub <#289 (comment)>, or mute the thread https://github.com/notifications/unsubscribe-auth/AALHOYBUILJJBF6AOBPZ6N3PR3BALANCNFSM4GLIY5BQ .

比如,
1、用户访问profile页面,我使用snsapi_base拿到openid,使用openid检索数据库查找用户,如果检索不到,则说明是新用户,尚未注册,则跳转到register页,register页使用snsapi_userinfo方式授权获取用户信息,保存数据库后再跳转回profile页,这样就通过用户授权获取到了用户信息并注册
2、用户下次再访问profile页,依然是snsapi_base拿到openid,检索数据库,找到用户,写 session

@overtrue
Copy link
Owner

中间件本来就支持 scope 参数啊?你从 URL 传递不就得了?

@colder-winter
Copy link

中间件本来就支持 scope 参数啊?你从 URL 传递不就得了?

正如题主说的,因为profile页已经使用中间件拿过snsapi_base了,session('wechat.oauth_user.default')已经写入了snsapi_base方式拿到的user_info,跳转到register页时,中间件发现已经有这个session值了,就不会再去拿snsapi_userinfo

@overtrue
Copy link
Owner

overtrue commented Apr 23, 2019 via email

@almas1992
Copy link

此问题仍然存在,题主的关于无感登录的需求很实际,这里要是能做一下优化的话,实在是好极了

做优化?授权弹窗不是这个包能控制的吧?只获取openid不需要授权,可获取全部信息每隔一段时间得重新授权的

题主的方案是:
1、用户第一次登录时,使用snsapi_userinfo授权方式(需弹窗)获取用户信息,并注册
2、以后用户来访时,使用snsapi_base获取openid(不需弹窗),实现无感登录
3、这个方案就只需要用户授权一次,以后再也不需要用户授权了

既然解决方案都有了,那就自己撸起袖子加油干了,涉及到判断首次登陆查询数据库这类的,我觉得这已经超出easy-wechat的职责范围了

@overtrue
Copy link
Owner

overtrue commented Apr 23, 2019 via email

@colder-winter
Copy link

因为用户在session过期后再来访问,会被再次要求授权,对用户造成打扰。而且,静默授权无感登录很好啊。

@colder-winter
Copy link

类似这个意思吧,如果在中间件里判断一下

middleware

@overtrue
Copy link
Owner

overtrue commented Apr 23, 2019 via email

@qq447665722
Copy link
Author

qq447665722 commented Apr 29, 2019

我还以为我的issues已经沉了
@overtrue 其实我想知道为什么在7bb0212版本中删除了判断是否需要重新认证的代码
如果有这个判断,应该可以自动判断是否需要升级为snsapi_userinfo授权
image
@colder-winter 也关注一下7bb0212,这个版本的的代码吧
7bb0212#diff-60152e924ed42a9568972e07d7551558

@overtrue
Copy link
Owner

overtrue commented Sep 9, 2019

@qq447665722 这么做的目的是什么?减少请求微信 API ?

@qq447665722
Copy link
Author

以前版本的逻辑不是由snsapi_base升级为snsapi_userinfo时自动重新授权吗?
这个逻辑不是很好吗?为什么要改掉?这样做可以减少对微信的请求,减少界面的跳转,对用户体验也很好呀?问一下之前改掉的原因是什么会造成什么不良影响吗?

@qq447665722
Copy link
Author

我的开发场景是这样的:
前后端分离开发,客户端请求服务端登录(base中间件),服务端发现数据库没有此用户信息->跳转到服务端重定向注册接口(user_info中间件)(可能由于登录时已经产生了session,所以没有调用到user_info中间件,所以无法拿到用户的unionid)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants