首页 > 解决方案 > 将来自社交提供者的响应传回 API 端点

问题描述

我正在尝试使用社交名流将社交身份验证添加到 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。因此,在谷歌应用程序中,我设置了用户在成功通过同一端点身份验证后将被重定向到的 URIhttp://localhost:8000/api/v1/user

现在,当用户尝试使用 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则会返回社交用户信息。

那我应该怎么做。我已经做了几天了。

标签: phplaravellaravel-socialite

解决方案


那是因为您没有在请求的标头中添加授权。如果您使用令牌,则不需要重定向用户,您的应用程序应该是一个 spa 项目,因此您将使用 js 框架从您身边重定向他。您需要发送Authorization您的标头,并且您需要使用您在响应中返回的令牌指定它,如下所示:

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

或者如果您正在使用axios

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

推荐阅读