php - 将来自社交提供者的响应传回 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
则会返回社交用户信息。
那我应该怎么做。我已经做了几天了。
解决方案
那是因为您没有在请求的标头中添加授权。如果您使用令牌,则不需要重定向用户,您的应用程序应该是一个 spa 项目,因此您将使用 js 框架从您身边重定向他。您需要发送Authorization
您的标头,并且您需要使用您在响应中返回的令牌指定它,如下所示:
jQuery.ajaxSetup({
headers: {
'Authorization': 'Bearer '+token
}
});
或者如果您正在使用axios
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;
推荐阅读
- python - 尝试遍历列表并收到错误:TypeError:“int”类型的参数不可迭代
- django-rest-framework - Django REST IsAuthenticated Permission Class with django-rest-knox not working
- java - maven-publish插件中versionMapping的作用是什么
- typescript - TypeScript 中的类和泛型
- c++ - Asio Bad File Descriptor 仅在某些系统上
- django - 将heroku用于我的django web时的ImportError
- ruby-on-rails - 我如何制作一个模型来验证 has_one 关系与外键约束的存在
- amazon-web-services - 如何更新无服务器的 lambda 应用程序?
- android - 用于音高检测的带有 Speex 回声消除的 TarsosDSP
- swift - Swift 将多个可选类型的数组声明为 Any 不能按预期工作