使用laravel社交名流后端通过社交帐户登录用户

使用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应用程序上的身份验证 已配置该软件包,我可以通过该软件包成功获取用户信息 我面临的问

我正在开发一个flatter应用程序,我想实现社交登录(Google和Facebook)

我的API是用Laravel实现的,并使用Laravel socialite对用户进行身份验证,还有后端、web前端(使用VueJs),现在我正在使用Flatter开发移动应用程序

web应用程序运行良好(使用vue social auth包)

我到目前为止所做的:

  • 使用Flatter_google_登录来处理Flatter应用程序上的身份验证
  • 已配置该软件包,我可以通过该软件包成功获取用户信息
  • 我面临的问题:

    我似乎没有做到的是将刚刚登录的用户发送到后端,以便提供应用内用户体验

    这是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"}
    
    这就是
    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);
        }