当前位置: 首页 > 知识库问答 >
问题:

在没有会话的情况下使用laravel Socialist和jwt auth

赵星华
2023-03-14

简短的版本:什么是适当的方式发送从Facebook登录生成的JWT(laravel/社会名流)到angularjs前端不使用会话。

长版本我正在制作一个应用程序,有angularjs前端和laravel 5.2后端。我使用tymonDesign/jwt-auth进行身份验证,而不是会话。

我还使用laravel/socialite进行社交Facebook身份验证。为此,我使用社交名流的无状态特性,这样我就不需要任何形式的会话。

基本的身份验证工作得很好。但是,当我尝试使用Facebook登录时,我遵循以下步骤

  1. 用户单击角侧的按钮,该按钮将重定向到后端的提供商登录页面。

公共函数reDirectToProvider(){返回社会化e::('facebook')-

        try {
        $provider = Socialite::with('facebook');

        if ($request->has('code')) {
            $user = $provider->stateless()->user();
        }

    } catch (Exception $e) {
        return redirect('auth/facebook');
    }

    return $this->findOrCreateUser($user);

接下来,我使用findor创建函数来确定用户是否存在。如果没有,我只是创建一个新用户,并从中创建JWT。

    $user = User::where('social_id', '=', $facebookUser->id)->first();

if (is_object($user)) {
    $token = JWTAuth::fromUser($user);
    return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular 
} else {
    $result = array();
    $result['name'] = $facebookUser->user['first_name']
    $result['email'] = $facebookUser->user['email'];
    $result['social_id'] = $facebookUser->id;
    $result['avatar'] = $facebookUser->avatar;
    $result['gender'] = $facebookUser->user['gender'];
    $result['status'] = 'active';
    $result['login_type'] = 'facebook';
    $result['user_type'] = 'free_user';

    try {
        $user = User::create($result);
    } catch (Exception $e) {
        return response()->json(['error' => 'User already exists.'], HttpResponse::HTTP_CONFLICT);
    }
    $token = JWTAuth::fromUser($user);
    return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular
}

我的问题是,在最后一段代码中,我必须通过url将jwt发送到前端。这一点都不安全。在不使用会话的情况下,将生成的JWT发送到前端的正确方法是什么。非常感谢。


共有3个答案

夹谷山
2023-03-14

您可以存储令牌并使用客户端重定向(无需存储到浏览器历史记录)将用户重定向到配置文件页面(URL中无令牌):

document.location.replace({profile-url})
江亮
2023-03-14

如果您在Angular端使用$超文本传输协议,请尝试从Laravel返回令牌作为JSON响应:

return response()->json(compact('token'));

然后将令牌存储在localStoragesessionStorage或您拥有的任何内容中。

如果您是从Laravel中生成角度页面(例如,不使用Laravel作为API,而是从/public/index.php显示角度页面),您可以在视图的数据中加载带有标记的视图。

只要您使用HTTPS,这两种方案中的任何一种都比在重定向URL中传递令牌要好。

马泓
2023-03-14

Laravel社交名流的官方文件中说:

无状态身份验证

无状态方法可用于禁用会话状态验证。这在向API添加社交身份验证时很有用:

return Socialite::driver('google')->stateless()->user();

然后,您可以使用jwt-auth方法进行身份验证:

JWTAuth::fromUser($user)
 类似资料:
  • 在Spring Boot的文档中,我只找到了使用Redis会话的例子,不使用Redis也能使用它吗?

  • 我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?

  • 问题内容: 我正在使用Hibernate 4.0.1.Final。如果该对象已通过org.hibernate.Session.load(Class clazz,Serializable id)方法加载并且没有活动的会话,是否可以访问该对象的字段? 我使用此代码通过id访问对象… 但是如果我的对象没有活动的会话,例如这段代码…… 我在“ System.out”行上收到此错误… 问题答案: 使用代替

  • 有没有办法在Spring MVC中获取当前会话,但不是通过请求。通常,我们所做的是在操作/控制器类方法中获取请求。从这个请求中,我们逐个请求获得会话。getSession()。但是,有没有办法在没有此请求对象的情况下获取此会话? 我的动机是,在一个实用程序类中,我需要访问会话中设置的值,而这个实用程序类方法是从控制器类的50多个方法中访问的。如果我必须从请求中获得会话,那么我需要更改所有这50个位

  • 我在我的Android应用程序中使用JSch,我想创建一个SSH连接,而无需最初提供用户名和密码。如果我提供用户名和密码,我可以连接,但如果我不提供用户名,我会从JSch得到一个用户名没有给出“错误”。 这是我试图在不提供用户名和密码的情况下连接的。 我唯一的选择是将JSch的源代码更改为允许,编译成jar,然后导入它吗?

  • 问题内容: 我想学习Angular 2并切换到使用它的应用程序,但是,我在使用TypeScript时遇到问题。 在当前环境中,我不能使用使用transpiler /编译器。我目前只需要运行node.js可执行文件(node.exe),而不必运行完整的node.js应用程序,也不需要运行npm。Angular 2是用TypeScript编写的,因此在将其发送到浏览器之前,需要先将其编译为JavaSc

  • 问题内容: 我从Vaadin开始,我想知道在不使用maven的情况下在NetBeans中使用此框架是否可行。原因是使用maven的项目需要很长时间才能下载依赖项,并且由于超时连接问题而无法运行。 我已经下载了“多合一”文件,并尝试按照这些README.txt文件的说明进行操作: 将除vaadin-client和vaadin-client-compiler以外的所有vaadin- *文件复制到项目中

  • 问题内容: 我想使用Amazon Elastic Load Balancer将WebSocket连接代理到多个node.js服务器。由于Amazon ELB不提供实际的WebSocket支持,因此我需要使用其原始的TCP消息传递。但是,我试图了解没有某种粘性会话功能的情况如何工作。 我了解WebSocket的工作方式是首先从客户端发送HTTP升级请求,服务器通过发送正确处理密钥身份验证的响应来处理