讨论数量:
翻完源码,发现框架并不允许重定向时携带参数,而且,只能重定向至GET
请求的Path
。所以,单一依赖redirect
方法的话,是行不通的。但是,我可以提供几种曲线救国的方案,你可以参考下:
Plan A
- 将参数通过
http_build_query($request->all())
方法转化为url冒号后的参数,形如name=Mike&age=10
。 - 然后将转化后的参数拼接到需要重定向路由的后面,形如
/oauth/token?name=Mike&age=10
。 - 最后
return redirect($url)
,就可以在另一个接口中通过$request->all()
方法接收到参数了。
Plan B
- 将参数通过
return redirect('/oauth/token')->with('body', $request->all())
的方式,闪存到session
中。 - 最后在
oauth/token
接口中,可以通过session('body')
的方式,获取到参数了。这个闪存的参数是一次性的,所以不用担心会占用过多的存储空间。
Plan C
- 通过
return redirect()->action('UserController@oauthToken', $request->all())
的方式,直接调用目标路由对应的控制器中的方法,顺带传参数。
Plan D
- 直接在当前路由中,调用
return app()->make('UserController')->oauthToken($request)
,看上去与上面的方案差不多,但是,这个方案可以跨过 重定向只能是GET请求 的限制。
希望这个答案对你有帮助。
没给场景,我脑补一下吧。 /oauth/token
这个路由应该是在 API
认证中,通过授权码来获取登录凭据 token
这一步的。也就是 应用A
找 认证中心B
颁发登录凭证。这是两个服务之间的通信,需要接收响应数据的。而 redirect
是转交给浏览器来跳转,跳转后就落地到目标系统了,不存在接收响应数据的情况。所以这里应该是楼主理解错了 oauth
的认证流程 ,不应该用 redirect
,而是做服务端请求。
建议先摸清楚 oauth
认证的逻辑与原理,如果是在研究这一块的内容,那么最好先起两个服务用来区分应用与认证中心,否则很容易掉到这个坑里。
参考官方文档:将授权码转化为访问令牌 部分:
$http = new GuzzleHttp\Client;
// 这里是POST请求,应该满足你的需求
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'redirect_uri' => 'http://example.com/callback',
'code' => $request->code,
],
]);
推荐文章: