我正在开发一个颤振应用程序,我想实现社交登录(Google和Facebook)。
我的API是用Laravel实现的,使用Laravel-socialite对用户进行身份验证,有后端的web前端(使用VueJs),现在我正在使用flutter开发移动应用程序。
web应用程序运行良好(使用vue-social-auth包)。
到现在为止我所做的:
。
我面临的问题:
我似乎没有办法让刚刚登录到后端的用户来提供应用程序内的用户体验。
这就是vue-social-auth包提供的内容,以及我发送给后端的内容,后端运行良好:
{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"}这就是flutter_google_sign_in给出的内容(除了用户配置文件数据之外):
idToken: "",
accessToken: "",
serverAuthCode: "", serverAuthCode总是null。
我如何使它,使用相同的API逻辑,登录用户在颤振通过社会帐户?
谢谢。
发布于 2020-12-10 10:21:19
我已经解决了这个问题,在深入挖掘之后,我发现Laravel-Socialite具有使用他们的令牌内置登录用户的功能:
引用Socialite文档:
如果您已经为用户提供了有效的访问令牌,则可以使用Socialite的userFromToken方法.
检索他们的详细信息。
发布于 2021-04-11 12:15:38
很明显,谷歌的登录除了Firebase/一些云API后端服务外,不起作用。我使用了本地的Laravel作为用户接口,因此添加google_sign_in功能需要设置一个firebase帐户/配置文件,下载并添加googleservices.json文件,以执行google_sign_in包安装手册中的解释。您还需要导入firebase-auth包。
颤振代码(我使用颤振模块模式,但同样适用于Bloc/Provider,如果您得到了上面Hamza Mogni解释的想法)
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!');
}
}对于Logout功能,您需要同时登录firebase和google帐户实例,否则在随后的登录尝试中,您将始终被第一个已知/使用的google帐户登录。
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!');
}
}Laravel代码(路由到控制器方法是api/auth/ google,该方法期望从flutter应用程序接收谷歌访问令牌)
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);
}https://stackoverflow.com/questions/65142862
复制相似问题