gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:13:45 26 4
gpt4 key购买 nike

我正在构建一个封闭的应用程序(用户需要进行身份验证才能使用它)。我无法从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com