angularjs - 使用 Laravel 和 Latchet websocket 构建实时应用程序

标签 angularjs laravel websocket autobahn ratchet

我正在构建一个封闭的应用程序(用户需要进行身份验证才能使用它)。我无法从 Latchet session 中识别当前已通过身份验证的用户。由于 apache 不支持长期连接,我将 Latchet 托管在单独的服务器实例上。这意味着我的用户收到两个 session_id。每个连接一个。我希望能够识别两个连接的当前用户。

我的客户端代码是基于 AngularJS 的 SPA。对于客户端 WS,我使用的是 Autobahn.ws WAMP v1 实现。 ab 框架指定了认证方法:http://autobahn.ws/js/reference_wampv1.html#session-authentication ,但我究竟该怎么做呢?

我是否在客户端上保存用户名和密码并在执行登录后重新传输这些(顺便说一下,这与我的 SPA 的其余部分分开)?如果是这样,这不是安全问题吗?

什么会收到认证请求服务器端?我找不到任何这方面的例子......

请帮忙?

附言我没有足够的声誉来创建标签“Latchet”,所以我使用 Ratchet(Latchet 是基于它构建的)。

最佳答案

创建一个名为 AuthenticationService 的 angularjs 服务,在需要的地方注入(inject)并调用它:

AuthenticationService.check('login_name', 'password');

此代码存在于名为 authentication.js 的文件中。它假设高速公路已经包括在内。我确实必须编辑这段代码,大量删除我在其中的所有额外废话,它可能有一两个语法错误,但想法就在那里。
angular.module(
  'top.authentication',
  ['top']
)

.factory('AuthenticationService', [ '$rootScope', function($rootScope) {
    return {
        check: function(aname, apwd) {
              console.log("here in the check function");
              $rootScope.loginInfo = { channel: aname, secret: apwd };
              var wsuri = 'wss://' + '192.168.1.11' + ':9000/';
              $rootScope.loginInfo.wsuri = wsuri;
              ab.connect(wsuri,
                  function(session) {
                      $rootScope.loginInfo.session = session;
                      console.log("connected to " + wsuri);
                      onConnect(session);
                  },
                  function(code,reason) {
                      $rootScope.loginInfo.session = null;
                      if ( code == ab.CONNECTION_UNSUPPORTED) {
                          console.log(reason);
                      } else {
                          console.log('failed');
                          $rootScope.isLoggedIn = 'false';
                      }
                  }
              );

              function onConnect(sess) {
                  console.log('onConnect');
                  var wi = $rootScope.loginInfo;
                  sess.authreq(wi.channel).then(
                    function(challenge) {
                        console.log("onConnect().then()");
                        var secret = ab.deriveKey(wi.secret,JSON.parse(challenge).authextra);
                        var signature = sess.authsign(challenge, secret);
                        sess.auth(signature).then(onAuth, ab.log);
                    },ab.log
                  );
              }

              function onAuth(permission) {
                  $rootScope.isLoggedIn = 'true';
                  console.log("authentication complete");
                  // do whatever you need when you are logged in..
              }
        }
    };
    }])

那么你需要服务器端的代码(正如你所指出的)。我假设您的服务器端 Web 套接字是 php 编码。我对此无能为力,一年多没有用 php 编码了。在我的例子中,我使用 python,我包含高速公路齿轮,然后子类化 WampCraServerProtocol,并替换一些方法(onSessionOpen、getAuthPermissions、getAuthSecret、onAuthenticated 和 onClose)正如你所想象的那样,这些是 Angular 码敲门。我认为高速公路不支持 php,因此,您必须自己编写身份验证的服务器端。

无论如何,我的后端更像@oberstat 描述的那样。我通过老式 https 建立身份验证,创建 session cookie,然后执行 ajax 请求“票”(这是我与网络身份验证 session 关联的临时名称/密码)。这是一个一次性的名称/密码,必须在几秒钟内使用,否则它就会消失。关键是我不必保留用户的凭据,我已经有了可以创建可以使用的票证的 cookie/ session 。这也有一个很好的副作用,我的 ajax session 与我的 Web 套接字 session 相关,对任何一个的查询都归因于后端的同一个 session 。

-G

关于angularjs - 使用 Laravel 和 Latchet websocket 构建实时应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339328/

相关文章:

javascript - AngularJS 动态注入(inject)范围或 Controller

javascript - 如何在转发器中显示基于值的指令

javascript - VueJS 和 Laravel,当用户离开屏幕时执行发布请求

ssl - 如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS

javascript - 如何更改使用 $location 与 angularJS 的 URL

php - 从转换内部的分页中删除行

php - Laravel:错误 "The page has expired due to inactivity"(419 未知状态)

google-chrome-extension - chrome 扩展 websocket 保持事件状态

node.js - 连接 socketcluster 服务器

angularjs - AngularFire:如何将部分更新(单个字段)应用于 $firebaseArray 中的项目?