所以我写了一个带有'授权'逻辑的Socket.IO应用程序,以确保用户在允许用户连接到websocket服务器之前登录到Twitter。但我遇到的问题是client.js尝试在用户点击TWITTER LOGIN(即io授权检查)之前执行io.connect,因为它尚未通过身份验证而失败。当用户最终点击Twitter登录并完成OAuth流程时,套接字无法连接,因为套接字身份验证逻辑已从初始连接失败。
server.js
// routes
app.get('/auth/twitter', passport.authenticate('twitter'), function(req, res){});
app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/login' }), function(req, res){
res.redirect('/authed');
});
// socket auth
parseCookie = require('connect').utils.parseCookie;
io.configure(function () {
io.set('authorization', function (data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['session.sid'];
sessionStore.get(data.sessionID, function (err, session) {
if (err || !session || (typeof session.twitter.user == 'undefined')) {
accept(null, false);
}
else {
data.session = session;
accept(null, true);
}
});
}
else {
return accept(null, false);
}
});
io.sockets.on('connection', function (socket) {
console.log('authenticated!');
socket.on('hooray', function(){
console.log('client message received');
});
});
client.js
var socket = io.connect(http://example.com); // connect to server.js code
socket.on('connect', function() {
alert('client connected!');
socket.emit('hooray');
});
// code for twitter link url for user to authenticate
<a href="www.example.com/twitter/auth">twitter login!</a>
所以问题是..服务器端的“连接”和客户端的“连接”功能都没有运行,因为用户从未登录过Twitter。当用户最终登录时,套接字授权功能已经失败。
如何让客户端在用户实际登录之前不尝试连接?我是否将其保存在其他文件中并稍后导入?我是否在授权功能中编写了一些服务器回调?我的javascript很弱,因为我正在学习javascript以及socket.io。请多多指教,谢谢。
答案 0 :(得分:2)
如果您使用ejs进行渲染,代码将如下所示:
server.js
app.get("/authed", function (req, res) {
res.render("authed", {});
});
layout.ejs
<body>
<div>
<%- body %>
</div>
</body>
index.ejs
<a href="www.example.com/twitter/auth">twitter login!</a>
authed.ejs
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect();
socket.on('connect', function() {
alert('client connected!');
socket.emit('hooray');
});
</script>
...
...
render whatever else
希望这有帮助。