将响应从社交提供程序传递回API端点

时间:2019-08-03 20:05:31

标签: php laravel laravel-socialite

我正在尝试使用socialite将社交身份验证添加到laravel 5.8 API应用程序中。按照https://laravel.com/docs/5.8/socialite#routing这里的文档,我创建了一个SocialAuthController,它将用户重定向到提供程序的身份验证页面,并像这样处理回调

...

use Socialite;

...

public function redirectToProvider($provider)
{
    return Socialite::driver($provider)->redirect();
}

public function handleProviderCallback($provider)
{
    // retrieve social user info
    $socialUser = Socialite::driver($provider)->stateless()->user();

    // check if social user provider record is stored
    $userSocialAccount = SocialAccount::where('provider_id', $socialUser->id)->where('provider_name', $provider)->first();

    if ($userSocialAccount) {

        // retrieve the user from users store
        $user = User::find($userSocialAccount->user_id);

        // assign access token to user
        $token = $user->createToken('string')->accessToken;

        // return access token & user data
        return response()->json([
            'token' => $token,
            'user'  => (new UserResource($user))
        ]);
    } else {

        // store the new user record
        $user = User::create([...]);

        // store user social provider info
        if ($user) {

            SocialAccount::create([...]);
        }

        // assign passport token to user
        $token = $user->createToken('string')->accessToken;
        $newUser = new UserResource($user);
        $responseMessage = 'Successfully Registered.';
        $responseStatus = 201;

        // return response
        return response()->json([
            'responseMessage' => $responseMessage,
            'responseStatus'  => $responseStatus,
            'token'           => $token,
            'user'            => $newUser
        ]);
    }
}

将路由添加到了web.php

Route::get('/auth/{provider}', 'SocialAuthController@redirectToProvider');

Route::get('/auth/{provider}/callback', 'SocialAuthController@handleProviderCallback');

然后我在GOOGLE_CALLBACK_URL=http://localhost:8000/api/v1/user文件中设置env

使用电子邮件/密码成功验证用户后,他们将被重定向到使用端点http://localhost:8000/api/v1/user的仪表板。因此,在google应用中,我设置了用户成功通过身份验证到同一端点http://localhost:8000/api/v1/user

后将重定向到的URI。

现在,当用户尝试使用google登录时,该应用会引发401 unauthenticated错误。

// 20190803205528
// http://localhost:8000/api/v1/user?state=lCZ52RKuBQJX8EGhz1kiMWTUzB5yx4IZY2dYmHyJ&code=4/lgFLWpfJsUC51a9yQRh6mKjQhcM7eMoYbINluA58mYjs5NUm-yLLQARTDtfBn4fXgQx9MvOIlclrCeARG0NC7L8&scope=email+profile+openid+https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email&authuser=0&session_state=359516252b9d6dadaae740d0d704580aa1940f1d..10ea&prompt=none

{
  "responseMessage": "Unauthenticated",
  "responseStatus": 401
}

如果我更改了应将经过Google身份验证的用户重定向到的URI,例如GOOGLE_CALLBACK_URL=http://localhost:8000/auth/google/callback,则会返回社交用户信息。

所以我应该怎么做。我已经在这上呆了几天了。

1 个答案:

答案 0 :(得分:0)

这是因为您没有在请求的标题中添加授权。 如果您正在使用令牌,则无需重定向用户,您的应用程序应为spa项目,因此您将使用js框架从侧面重定向用户。 您需要在标头中发送Authorization,还需要用令牌指定它,并在响应中将其返回,如下所示:

    jQuery.ajaxSetup({
       headers: {
         'Authorization': 'Bearer '+token
       }
    });

或者如果您使用的是axios

   axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;