Satellizer OAuth取消链接会产生404错误

时间:2016-08-20 11:48:20

标签: angularjs laravel oauth satellizer

我正在使用Laravel后端为Facebook测试satellizer示例,一旦用户将Facebook帐户链接到应用程序就无法将其与卫星链接,只要用户点击Facebook Unilink按钮就会出现404错误,

http://localhost:8000/auth/unlink 

404未找到。 但是在Laravel路由器上。

Route::get('auth/unlink/{provider}', ['middleware' => 'auth', 'uses' => 'AuthController@unlink']);

请帮我解决这个问题。

1 个答案:

答案 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是默认的,因此路由永远不会工作。

很抱歉,如果我不是更清楚,因为这是我第一次尝试将我的想法放在这里,英语不是我的第一语言。

祝你好运。