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

网页授权共享session已晚 #792

Closed
skyred opened this issue Jul 9, 2017 · 5 comments
Closed

网页授权共享session已晚 #792

skyred opened this issue Jul 9, 2017 · 5 comments

Comments

@skyred
Copy link
Contributor

skyred commented Jul 9, 2017

我用的环境

PHP 版本:7.1.2
overtrue/wechat 版本:3.3.8

问题及现象

描述你的问题现象,报错贴截图粘贴或者贴具体信息,提供必要的代码段

根据文档上说明, 当使用网页授权的时候的时候, 可以根据自己的框架来共享session, 文档里给的例子是:

$response = $app->oauth->scopes(['snsapi_userinfo'])
                          ->setRequest($request)
                          ->redirect();

https://easywechat.org/zh-cn/docs/oauth.html

但是, 在这一步的时候:

$response = $app->oauth

其实, 已经执行了这段代码:

    protected function createDefaultRequest()
    {
        $request = Request::createFromGlobals();
        $session = new Session();

        $request->setSession($session);

        return $request;
    }

也就是说, 一个香草型的session已经被创建. 在其他框架里, 例如, 有custom session storage的情况里, 发生冲突.

有没有简单的解决方案?

@overtrue overtrue closed this as completed Jul 9, 2017
@skyred
Copy link
Contributor Author

skyred commented Jul 10, 2017

@overtrue 是的, 你提供的代码是没问题的. 但是, 这个issue是说, ->setRequest($request) 是在 createDefaultRequest() 运行之后再运行.

问题在于 createDefaultRequest() 里已经运行了一边 $session = new Session();, 这一行代码在有custom session storage里有可能会发生冲突.

我在找有什么办法能在__construct()里就把$session传递进去, 这样避免 createDefaultRequest() 运行.

以上描述有说清问题吗?

@overtrue
Copy link
Collaborator

什么冲突?

@skyred
Copy link
Contributor Author

skyred commented Jul 10, 2017

我使用的是Drupal, 建立在Symfony 2上, Drupal 有个 custom class SessionManager extends NativeSessionStorage, 当有新的session建立, 就会覆盖已经有的session, 而新的session不满足条件(具体条件还没查清楚), 就会被destroy() http://cgit.drupalcode.org/drupal/tree/core/lib/Drupal/Core/Session/SessionManager.php?id=e1e2161#n187

以上的冲突应该比较少见. 因为现在用Symfony在用 custom SessionStorage被认为是legacy app. 包括Drupal 8在内, 长远计划是利用更多的Symfony session management.

所以, 我现在调查的一个方向是, 看看可不可以在SocialiteManager::__construct()里直接把session传递进去. 目前, 我看见的方法是直接调用/overtrue/socialite, 而不使用/overture/wechat的封装.

你想到更快捷的方法吗?

@overtrue
Copy link
Collaborator

嗯,换包是可以,但是我看了一下源码,建议你看看其中这个方法:$this->isSessionObsolete() 为啥会为真?因为毕竟代码里没有静态属性,所以就算创建两次也是不同的实例。

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

2 participants