使用laravel社交名流后端通过社交帐户登录用户
我正在开发一个flatter应用程序,我想实现社交登录(Google和Facebook) 我的API是用Laravel实现的,并使用Laravel socialite对用户进行身份验证,还有后端、web前端(使用VueJs),现在我正在使用Flatter开发移动应用程序 web应用程序运行良好(使用vue social auth包) 我到目前为止所做的:使用laravel社交名流后端通过社交帐户登录用户,laravel,flutter,laravel-socialite,Laravel,Flutter,Laravel Socialite,我正在开发一个flatter应用程序,我想实现社交登录(Google和Facebook) 我的API是用Laravel实现的,并使用Laravel socialite对用户进行身份验证,还有后端、web前端(使用VueJs),现在我正在使用Flatter开发移动应用程序 web应用程序运行良好(使用vue social auth包) 我到目前为止所做的: 使用Flatter_google_登录来处理Flatter应用程序上的身份验证 已配置该软件包,我可以通过该软件包成功获取用户信息 我面临的问
{code: "4/0AY0e-g442SMxdtLb_MVdQ63u1ydp48bbCRQco5Azoyf3y1rvYybDabyZGOvwAs7ZFJDQHA", scope: "email+profile+openid+https://www.googleapis.com/au…le+https://www.googleapis.com/auth/userinfo.email", authuser: "0", prompt: "consent"}
这就是flatter\u google\u sign\u in
提供的内容(除了用户档案数据:
idToken: "",
accessToken: "",
serverAuthCode: "",
serverAuthCode总是null
我怎样才能使用相同的API逻辑,让用户通过社交帐户登录到flifter上
谢谢。我已经解决了这个问题,经过一番挖掘,我发现
Laravel Socialite
具有使用内置令牌登录用户的功能:
引用社交名流文档:
如果您已经拥有用户的有效访问令牌,则可以使用Socialite的userFromToken方法检索其详细信息
显然,除了Firebase/some cloud API后端服务外,google登录在Flitter上不起作用。我使用的是本地Laravel API进行用户身份验证,因此添加google登录功能需要设置Firebase帐户/配置文件,下载googleservices.json文件并将其添加到Flitter项目中,如google_sign_in软件包中所述安装手册。您还需要导入firebase auth软件包 颤振代码(我使用颤振模块化模式,但如果您得到上面Hamza Mogni解释的想法,同样适用于Bloc/Provider)
import 'package:google_sign_in/google_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';
final GoogleSignIn _googleSignIn = GoogleSignIn();
final FirebaseAuth _auth = FirebaseAuth.instance;
Future<LoginResponseModel> googleLoginResponse() async {
String url = env['API_BASE_URL'] + '/api/auth/google';
//click on google sign in. Get accessToken from google through googlesignin
plugin.
//Send accessToken to socialite in backend to request/create user data
GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();
if (googleSignInAccount == null) {
print('Google Signin ERROR! googleAccount: null!');
return null;
}
GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
//this is user access token from google that is retrieved with the plugin
print("User Access Token: ${googleSignInAuthentication.accessToken}");
String accessToken = googleSignInAuthentication.accessToken;
//make http request to the laravel backend
final response =
await http.post(
url,
body: json.encode({"token": accessToken}),
headers: {"Content-Type": "application/json"});
if (response.statusCode == 200 || response.statusCode == 422) {
return LoginResponseModel.fromJson(
json.decode(response.body), // {'message':'Google signin successful'}
);
} else {
throw Exception('Failed to load data!');
}
}
Future<LogoutResponseModel> logout() async {
try {
await _auth.signOut();
await _googleSignIn.disconnect();
} catch (e) {
print('Failed to sign out ' + e.toString());
}
//api route to destroy sanctum token. santum token is added as authorization header
var url = env['API_BASE_URL'] + "/api/logout";
final response =
await http.post(Uri.tryParse(url), headers: {'Bearer ' $sanctumtoken});
if (response.statusCode == 200 || response.statusCode == 422) {
return LogoutResponseModel.fromJson(
json.decode(response.body),
);
} else {
throw Exception('Failed to load data!');
}
}
public function requestTokenGoogle(Request $request) {
// Getting the user from socialite using token from google
$user = Socialite::driver('google')->stateless()->userFromToken($request->token);
// Getting or creating user from db
$userFromDb = User::firstOrCreate(
['email' => $user->getEmail()],
[
'email_verified_at' => now(),
'first_name' => $user->offsetGet('given_name'),
'last_name' => $user->offsetGet('family_name'),
'avatar' => $user->getAvatar(),
]
);
// Returning response
$token = $userFromDb->createToken('Laravel Sanctum Client')->plainTextToken;
$response = ['token' => $token, 'message' => 'Google Login/Signup Successful'];
return response($response, 200);
}