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

authorizer_refresh_token刷新问题 #1033

Closed
lcnphp opened this issue Nov 25, 2017 · 11 comments
Closed

authorizer_refresh_token刷新问题 #1033

lcnphp opened this issue Nov 25, 2017 · 11 comments

Comments

@lcnphp
Copy link

lcnphp commented Nov 25, 2017

我用的环境

PHP 版本:php7.1
overtrue/wechat 版本:3.1
是否使用了框架?框架名称:Yii2

问题及现象

开放平台的authorizer_refresh_token要随着authorizer_access_token一起刷新,微信文档如下:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=&lang=zh_CN

5、获取(刷新)授权公众号或小程序的接口调用凭据(令牌)

个人解决方案

overtrue\wechat\src\OpenPlatform\AuthorizerAccessToken.php 第95行开始添加代码
$this->authorizer->setRefreshToken($token['authorizer_refresh_token']);

@mingyoung
Copy link
Collaborator

你确定刷新 authorizer_refresh_token 的同时,authorizer_refresh_token 会变?
我刚测试了,发现返回的 authorizer_refresh_token 还是不变的。

@lcnphp
Copy link
Author

lcnphp commented Nov 25, 2017

我刚刚也试过了,authorizer_refresh_token确实是不会变的。能否开放一个接口让开发者获取缓存里的authorizer_refresh_token,因为真实场景通常是在后台授权成功以后,在前台再去调用$app->createAuthorizerApplication($authorizerAppid, $authorizerRefreshToken)来处理业务

@mingyoung
Copy link
Collaborator

这个方法可以获取到已授权的列表:$app->getAuthorizerList()

@lcnphp
Copy link
Author

lcnphp commented Nov 25, 2017

谢谢!非常棒!

@lcnphp
Copy link
Author

lcnphp commented Nov 30, 2017

补充一下,$app->getAuthorizerList()是从微信接口获取的信息,跟mingyoung讨论过,确认了开发者自己要存一份authorizer_refresh_token到数据库来维护

@yizhihouzi
Copy link

不清楚为何authorizer_refresh_token不设计为自动缓存.access_token这些都缓存了.

@mingyoung
Copy link
Collaborator

不清楚为何authorizer_refresh_token不设计为自动缓存.access_token这些都缓存了.

那请问如果缓存过期了呢?再叫客户授权一次?

@yizhihouzi
Copy link

不清楚为何authorizer_refresh_token不设计为自动缓存.access_token这些都缓存了.

那请问如果缓存过期了呢?再叫客户授权一次?

理解了,你的意思是如果自动缓存,而缓存被清理后会丢失refresh_token,所以设计的时候希望开发者自行妥善保存refresh_token.
这是一个安全考虑.👍.

@yizhihouzi
Copy link

yizhihouzi commented Oct 14, 2020

不清楚为何authorizer_refresh_token不设计为自动缓存.access_token这些都缓存了.

那请问如果缓存过期了呢?再叫客户授权一次?

理解了,你的意思是如果自动缓存,而缓存被清理后会丢失refresh_token,所以设计的时候希望开发者自行妥善保存authorizer_refresh_token.
这是一个安全考虑.👍.

我仍有不理解的地方是:
1、其实如你所述,$app->getAuthorizerList()可以获取refresh_token,那么它丢失后利用这个接口重新获取一遍也还好.
2、另,根据 获取/刷新接口调用令牌接口定义,如果希望刷新authorizer_access_token,那么需要component_access_token、authorizer_refresh_token这两个令牌,然而component_access_token是被自动缓存的,缓存丢失后,只有authorizer_refresh_token而没有component_access_token,仍然无法刷新authorizer_access_token. 这样的话只是让开发者保存authorizer_refresh_token似乎有些不够.
我的理解正确吗,@mingyoung 望指点.

@mingyoung
Copy link
Collaborator

  1. 这个接口微信后来才加上 refresh_token 字段的,之前是没有返回的,所以要开发者自行存储才能保证不需要用户重复授权
  2. 其实这是为了方便使用做的一个不太严谨的设计。如果要缓存那要缓存 component_verify_ticket, component_access_token 等,使用上就会麻烦一点了…

P.S. 如果有更好设计欢迎指出~

@yizhihouzi
Copy link

  1. 这个接口微信后来才加上 refresh_token 字段的,之前是没有返回的,所以要开发者自行存储才能保证不需要用户重复授权
  2. 其实这是为了方便使用做的一个不太严谨的设计。如果要缓存那要缓存 component_verify_ticket, component_access_token 等,使用上就会麻烦一点了…

P.S. 如果有更好设计欢迎指出~

好的,理解了.
还是建议后续authorizer_refresh_token能自动保存,本地不存在时再通过接口获取一遍.这样通过开放平台application可以自由获取相关公众号、小程序的application,会方便很多. 也满足目前设计上尽量简化用户使用的要求. 🙏
PS: 在这个issue下面评论前, 我花了相当时间确认authorizer_refresh_token需要开发者保存这件事,因为他和其他地方设计思想不一致.😅

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

4 participants