2013-11-26 11 views
8

Kullanıcı günlüğe kaydediliyorsa, sunucu tarafında rota nasıl denetlenir?Demir yönlendirici sunucu tarafında Meteor.user()

'Before' üzerinde kontrol ekleyebilirim, ancak Metor.user() burada çalışmaz.

şimdiden teşekkürler.

p.s. How to get Meteor.user() to return on the server side?'u buldum, ancak demir-yönlendirici üzerinde çalışmaz

+0

yanı, ama olmadı: Burada tam kaynak kodu kontrol edebilirsiniz. Bunun yerine bir Meteor yöntemi yazmayı bitirdim. Bu ideal değil, ama en azından benim durumumda bu benim sorunum için uygun bir çözümdü. –

cevap

8

Korkarım ki bu mümkün değil. Problemin, iki farklı protokolle sunucuya bağlanmaya çalıştığınız gerçeği, hem kelimenin tam anlamıyla hem de mantıksal olarak gerçekleştiğinden, bu iki eylemi ilişkilendirmenin açık bir yolu olmadığı tahmin ediliyor.

Gereksinimlerinize uygun oldukça basit bir çözüm var. Basit bir ayrıcalık belirteçleri sistemi veya gizli anahtarlar veya bunlara ne diyorsanız onu geliştirmeniz gerekir. Birincisi, HTTP başlık içinde veya URL kendisinde ya, artık AJAX istek (veya şey) eklemek secretKey almak için istemci üzerinde kullanabilirsiniz, Sonra bir sunucu yöntemi

var Secrets = new Meteor.Collection("secrets"); // only on server!!! 

Meteor.methods({ 
    getSecretKey: function() { 
    if (!this.userId) 
     // check if the user has privileges 
     throw Meteor.Error(403); 
    return Secrets.insert({_id: Random.id(), user: this.userId}); 
    }, 
}); 

oluşturun. Korkma! HTTPS kullanıyorsa hepsi şifrelenecektir.

Sunucu tarafında, secretKey numarasını gelen istekten alıp Secrets koleksiyonunda bulunup bulunmadığını kontrol edebilirsiniz. Kullanıcının belli ayrıcalıklara sahip olup olmadığını öğrenirsiniz. Ayrıca güvenlik nedeniyle gizli anahtarlarınızı bir süreden sonra koleksiyondan çıkarmak isteyebilirsiniz.

+0

Açıklama ve çözüm için teşekkürler – elbowz

+0

Burada örnek olarak: https://github.com/apendua/meteor-uploader/blob/master/server.js Sunucu tarafında rota için connectHandlers kullanıyorsunuz. Bu yaklaşımı sunucu tarafı rotaları için hala önerir misiniz? Demir Router kullanıyorum ve yaklaşımınızın belirteçleri ile yaptığınız işe uygun olup olmadığını görmek isterim. – Aaron

+0

Ayrıca, çözümünüzün (bağlantıda) jetonları saklamak için bir veritabanı içermediğini veya belirteçlerin sona ermesini fark ettim, buna bir örnek verebilir misiniz? – Aaron

3

Yapmak istediğiniz şey, Meteor.user'nin isteğini doğrulamaktır. Bunu şu anda IronRouter.route() bağlamında yapıyorum. İstek, başlıkta geçerli bir kullanıcı kimliği ve auth jetonu ile yapılmalıdır. Ben Router.route() içinden bu işlevi çağırmak, bu daha sonra this.user bana erişim sağlar:

### 
    Verify the request is being made by an actively logged in user 
    @context: IronRouter.Router.route() 
### 
authenticate = -> 
    # Get the auth info from header 
    userId = this.request.headers['x-user-id'] 
    loginToken = this.request.headers['x-auth-token'] 

    # Get the user from the database 
    if userId and loginToken 
    user = Meteor.users.findOne {'_id': userId, 'services.resume.loginTokens.token': loginToken} 

    # Return an error if the login token does not match any belonging to the user 
    if not user 
    respond.call this, {success: false, message: "You must be logged in to do this."}, 401 

    # Attach the user to the context so they can be accessed at this.user within route 
    this.user = user 

    ### 
    Respond to an HTTP request 
    @context: IronRouter.Router.route() 
    ### 
    respond = (body, statusCode=200, headers={'Content-Type':'text/json'}) -> 
    this.response.writeHead statusCode, headers 
    this.response.write(JSON.stringify(body)) 
    this.response.end() 

Bu kod ağır Reststop ve RestStop2 esinlenmiş. Meteor 0.9.0+ REST API'lerini yazmak için bir meteor paketinin bir parçasıdır (Demir Router üzerine kurulu). Ben bu çalışma almak için çalışıyordu

https://github.com/krose72205/meteor-restivus