我正在使用Laravel后端为Facebook测试satellizer示例,一旦用户将Facebook帐户链接到应用程序就无法将其与卫星链接,只要用户点击Facebook Unilink
按钮就会出现404错误,
http://localhost:8000/auth/unlink
404未找到。 但是在Laravel路由器上。
Route::get('auth/unlink/{provider}', ['middleware' => 'auth', 'uses' => 'AuthController@unlink']);
请帮我解决这个问题。
答案 0 :(得分:0)
你找到了解决方案吗?
检查以下链接后,我最终为我的问题找到了解决方案。 https://github.com/sahat/satellizer/issues/269
基本上在Satellizer文档中解释了提供者和httpOptions是您可以通过unlink调用发送的参数,但是,这些选项永远不会被传递,因为它只从第一个参数中检索提供者的信息。
您可以在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>
我基本上已经在下面的JS代码中包含了我想要由变量提供程序发送的信息(重命名为just data)。
//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)
或使用像这样的输入外观
$input = Input::all();
在这里你可以用传递的变量值做任何你想做的事。现在取决于你的处理。
注意:如果httpOptions中没有传递任何方法,则卫星代码默认设置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是默认的,因此路由永远不会工作。
很抱歉,如果我不是更清楚,因为这是我第一次尝试将我的想法放在这里,英语不是我的第一语言。
祝你好运。