2013-10-25 69 views
0

我知道有很多這方面的步伐,但我真的沒有找到我在找什麼。用戶認證與節點js

所以我想讓用戶用節點js登錄,我使用express,mongo db,但大部分是socket.io。所以,我希望人們填寫自定義表單,從我的index.html:

app.get('/', function(req, res) { 
    fs.readFile(__dirname + '/../index.html', 'utf8', function(err, text){ 
    res.send(text); 
    }); 
}); 

<form method="get" id="lala" > 
    <input type="text" name="user"> 
    <input type="text" name="user"> 
    <button id="button">KOKo</button> 
</form> 

按鈕點擊:

socket.emit('checkLogin', { my collected data from the form }); 

所以現在在服務器端,我想檢查該用戶名和密碼,如果他們沒事,(我不知道它是如何在這裏,但在PHP中,我使SESSION['user_id'](例如),所以當用戶回來的另一個請求時,我可以檢查此會話,我知道用戶已登錄,他cna見頁面 我看過passport.js mongo-db會話存儲,但是我沒有能夠讓任何演示程序工作。存儲會話,如何檢查會話以及所有這些內容。

因此,如果有人可以幫我寫下來和我一樣的白癡演示,如:

function check_auth_user(username,password,done,public_id){ 
    var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1"; 
    connection.query(sql, function (err,results) { 
    if (err) throw err; 

    if(results.length > 0){ 

     var res=results[0]; 
     passport.serializeUser(function(res, done) { 
     done(null,res); 
     }); 

     passport.deserializeUser(function(id, done) { 
     done(null,res); 
     }); 
     return done(null, res); 
    } else { 
     return done(null, false); 
    } 
    }); 
} 

但是現在我如何設置會話進店,我應該如何在這之後去實現它?以及如何將其發送到從套接字io連接的正確用戶:-)

+0

如何使用快遞會議解釋 - http://blog.modulus.io/nodejs-and -express-sessions –

+0

感謝您編輯我的文章:-)。好吧,這是一個非常好的演示,我可以更深入地瞭解會話。現在我可以問我如何在我的套接字函數中達到這個「req」參數。因爲我得到的唯一參數只是套接字,我不知道如何返回,所以我可以console.log他。當我嘗試我得到︰ TypeError:將圓形結構轉換爲JSON 在Object.stringify(原生) – Izopi4a

回答

3

護照處理大部分爲您。

首先,您誤解了serializeUserdeserializeUser的方法。你應該在初始化應用程序時調用它們一次來註冊全局助手。 Passport將使用它們在認證後將用戶對象序列化爲user_id,並在用戶每次擊中API時將其序列化回用戶對象。

passport.serializeUser(function(res, done) { 
    done(null, res.id); 
}); 

passport.deserializeUser(function(id, done) { 
    var sql="SELECT * FROM `table` WHERE id = '"+ id +"' limit 1"; 
    connection.query(sql, function (err, results) { 
    done(err, results[0]) 
    }); 
}); 

所以,它使check_auth_user功能很簡單:

function check_auth_user(username, password, done){ 
    var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1"; 
    connection.query(sql, function (err, results) { 
    done(err, results[0]) 
    }); 
} 

passport.use(new LocalStrategy(check_auth_user)); 
app.post('/login', passport.authenticate('local', { 
    failureRedirect: '/login', 
    successRedirect: '/' 
})); 

護照將自動存儲user_id快遞會議,填充req.user全反序列化的用戶,但你應該確保兩個express.sessionpassport.session中間件是啓用。現在

app.use(express.session({ 
    secret: "very secret", 
    store: new RedisStore() // or any other Store 
})); 
app.use(passport.session()); 

,你就可以用req.user訪問用戶對象:

app.get('/hello', function (req, res) { 
    if (req.user) { 
    res.send('Hello, ' + req.user.username + ', your id is ' + req.user.id); 
    } else { 
    res.send('Hello anonymous'); 
    } 
}); 
+0

我知道這個問題將是真正的redicilous,但 - 我真的不知道什麼是'check_auth_user'和'護照' 。它完成了這個功能嗎?如果是這樣,你可以鏈接到一個有關它的文檔:-)。如果你知道如何在socket.io函數中獲得這個param「req」。 – Izopi4a

+0

看起來我錯過了使用'socket'的部分。io'而不是http調用。可能,您需要一些額外的模塊來處理'socket.io'的認證。你應該看看[passport.socketio模塊](https://github.com/jfromaniello/passport.socketio)和[這個問題](http://stackoverflow.com/questions/15093018/sessions-with-express-js -passport-JS)。 –

+0

啊,好吧,但我現在必須走了,今晚我會測試它,但是我測試它看起來很複雜,即使演示看起來很簡單:-)。我認爲問題是我需要不同的socket.io版本來完成這個工作,而不僅僅是模塊。或者可能是我錯了。 – Izopi4a