我正在尝试使用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
现在,当用户尝试使用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
,则会返回社交用户信息。
所以我应该怎么做。我已经在这上呆了几天了。
答案 0 :(得分:0)
这是因为您没有在请求的标题中添加授权。
如果您正在使用令牌,则无需重定向用户,您的应用程序应为spa项目,因此您将使用js框架从侧面重定向用户。
您需要在标头中发送Authorization
,还需要用令牌指定它,并在响应中将其返回,如下所示:
jQuery.ajaxSetup({
headers: {
'Authorization': 'Bearer '+token
}
});
或者如果您使用的是axios
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;