我正在用Facebook的Laravel后端测试satellizer示例,一旦用户将Facebook帐户链接到应用程序,就不可能使用satellizer解除链接,无论何时用户单击Facebook Unilink按钮都会给出404错误。
http://localhost:8000/auth/unlink 未找到404。但是在Laravel路由器上。
Route::get('auth/unlink/{provider}', ['middleware' => 'auth', 'uses' => 'AuthController@unlink']);请帮我修复这个bug。
发布于 2017-08-02 07:09:30
你找到解决这个问题的办法了吗?
检查下面的链接后,我最终为我的问题找到了一个解决方案。https://github.com/sahat/satellizer/issues/269
基本上在Satellizer文档中解释说,provider和httpOptions是您可以通过unlink调用发送的参数,但是,这些选项永远不会被传递,因为它只从第一个参数(即provider )检索信息。
您可以在下面的satellizer.js文件中的代码片段中看到有关接受的参数的更多信息。
OAuth.prototype.unlink = function (provider, httpOptions) {
if (httpOptions === void 0) { httpOptions = {}; }
httpOptions.url = httpOptions.url ? httpOptions.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.unlinkUrl);
httpOptions.data = { provider: provider } || httpOptions.data;
httpOptions.method = httpOptions.method || 'POST';
httpOptions.withCredentials = httpOptions.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(httpOptions);
};我的解决方案不是很优雅,如下:
html
<button class="btn btn-sm btn-danger float-left" ng-if="user.facebook"
ng-click="unlink({provider:'facebook', options: {'param1':'value','param2':'value2'}})"><i class="ion-social-facebook"></i> Unlink Facebook Account
</button>我基本上已经将我想要通过变量provider (重命名为data)发送的信息包装在下面的JS代码中。
//unlink a social login profile from user's profile
$scope.unlink = function (data) {
console.log(data);
$auth.unlink(data)
.then(function () {
toastr.info('You have unlinked a ' + data.provider + ' account');
$scope.getProfile();
})
.catch(function (response) {
toastr.error(response.data ? response.data.message : 'Could not unlink ' + data.provider + ' account', response.status);
});通过视图发送的JSON看起来并不美观,但可以正常工作:
provider Object
provider "facebook"
options Object
flag "unlink"
view "profile"
userId 236上面没有解决404问题,但解决了从原始的卫星解锁函数传递参数的问题。
路由的问题发生是因为Laravel在函数"public function handle($request,Closure $next)“内的Authenticate.php文件中阻塞了该路由。
您可以在没有中间件的情况下进行路由
Route::post('auth/unlink', 'AuthController@unlink');
Route::get('auth/unlink', 'AuthController@unlink');
Route::any('auth/unlink', 'AuthController@unlink');上面的代码将确保调用将以某种方式命中控制器。如何在控制器中获取参数将取决于您是否选择post/get/any。这意味着您将通过Laravel变量$request从
public function unlink(Request $request)或者像这样使用输入facade
$input = Input::all();在这里,您可以随心所欲地处理传递的变量值。现在就看你的处理了。
注意:默认情况下,如果在httpOptions中没有传入任何方法,则satellizer代码会设置POST方法,如下所示:
OAuth.prototype.unlink = function (provider, httpOptions) {
if (httpOptions === void 0) { httpOptions = {}; }
httpOptions.url = httpOptions.url ? httpOptions.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.unlinkUrl);
httpOptions.data = { provider: provider } || httpOptions.data;
httpOptions.method = httpOptions.method || 'POST';
httpOptions.withCredentials = httpOptions.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(httpOptions);
};当Laravel示例的代码附带调用get方法而不是post的路由,并且在js示例中没有将http的选项设置为get时,这并没有真正的帮助。这意味着您正在尝试调用get,其中post是缺省的,因此路由将永远不会工作。
抱歉,如果我说得不够清楚,因为这是我第一次尝试把我的想法放在这里,而英语并不是我的第一语言。
祝好运。
https://stackoverflow.com/questions/39053776
复制相似问题