首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >登录用户在使用laravel-socialite后端的社交账户中随意浏览

登录用户在使用laravel-socialite后端的社交账户中随意浏览
EN

Stack Overflow用户
提问于 2020-12-04 11:36:06
回答 2查看 3K关注 0票数 4

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

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

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

到现在为止我所做的:

  1. 使用flutter_google_sign_in处理颤振应用程序上的身份验证。
  2. 确实配置了该包,我可以通过该软件包成功地获取用户信息。

我面临的问题:

我似乎没有办法让刚刚登录到后端的用户来提供应用程序内的用户体验。

这就是vue-social-auth包提供的内容,以及我发送给后端的内容,后端运行良好:

代码语言:javascript
复制
{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给出的内容(除了用户配置文件数据之外):

代码语言:javascript
复制
idToken: "",
accessToken: "",
serverAuthCode: "", 

serverAuthCode总是null

我如何使它,使用相同的API逻辑,登录用户在颤振通过社会帐户?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-10 10:21:19

我已经解决了这个问题,在深入挖掘之后,我发现Laravel-Socialite具有使用他们的令牌内置登录用户的功能:

引用Socialite文档:

如果您已经为用户提供了有效的访问令牌,则可以使用Socialite的userFromToken方法.

检索他们的详细信息。

票数 3
EN

Stack Overflow用户

发布于 2021-04-11 12:15:38

很明显,谷歌的登录除了Firebase/一些云API后端服务外,不起作用。我使用了本地的Laravel作为用户接口,因此添加google_sign_in功能需要设置一个firebase帐户/配置文件,下载并添加googleservices.json文件,以执行google_sign_in包安装手册中的解释。您还需要导入firebase-auth包。

颤振代码(我使用颤振模块模式,但同样适用于Bloc/Provider,如果您得到了上面Hamza Mogni解释的想法)

代码语言:javascript
复制
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帐户登录。

代码语言:javascript
复制
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应用程序接收谷歌访问令牌)

代码语言:javascript
复制
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);
    }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65142862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档