2013-11-26 14 views
8

Jak sprawdzić na trasie po stronie serwera, czy użytkownik jest zalogowany?Meteor.user() na stronie serwera routera żelaznego

Dodałbym zaznaczenie "przed", ale Metor.user() nie działają tutaj.

z góry dzięki.

p.s. Znalazłem How to get Meteor.user() to return on the server side?, ale nie działa na żelaznym routerze

+0

starałem się uzyskać tej pracy, jak również, ale nie. Zamiast tego napisałem Meteor Metodzie. To nie jest idealne, ale przynajmniej w moim przypadku było to możliwe rozwiązanie mojego problemu. –

Odpowiedz

8

Obawiam się, że nie jest to możliwe. Domyślam się, że problem polega na tym, że próbujesz połączyć się z serwerem za pomocą dwóch różnych protokołów - zarówno dosłownie, jak i logicznie - tak więc nie ma oczywistego sposobu na powiązanie tych dwóch działań.

Istnieje jednak bardzo proste rozwiązanie, które może odpowiadać Twoim potrzebom. Będziesz musiał opracować prosty system tokenów przywilejów, tajnych kluczy lub cokolwiek je nazwiesz. Po pierwsze, stworzenie metody serwera

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}); 
    }, 
}); 

Następnie można teraz używać go na kliencie, aby uzyskać secretKey które przywiązują do żądania AJAX (lub coś), albo w nagłówku HTTP lub w samym URL. Nie bój się! Wszystkie zostaną zaszyfrowane, jeśli używasz HTTPS.

Po stronie serwera można teraz pobrać secretKey z przychodzącego żądania i sprawdzić, czy jest on obecny w kolekcji Secrets. Dowiesz się wtedy, czy użytkownik ma określone uprawnienia, czy nie. Możesz również usunąć tajne klucze z kolekcji po pewnym czasie ze względów bezpieczeństwa.

+0

Dzięki za wyjaśnienie i rozwiązanie – elbowz

+0

W twoim przykładzie tutaj: https://github.com/apendua/meteor-uploader/blob/master/server.js wydaje się, że używasz connectHandlers dla trasy po stronie serwera. Czy nadal zaleca się takie podejście dla tras po stronie serwera? Używam Iron Routera i chciałbym sprawdzić, czy Twoje podejście pasuje do tego, co robisz z tokenami. – Aaron

+0

Zauważyłem również, że twoje rozwiązanie (w linku) nie zawiera bazy danych do przechowywania tokenów lub wygaśnięcia tokenów, czy możesz podać przykład tego? – Aaron

3

Jeśli chcesz uwierzytelnić Meteor.user wysyłającego żądanie, obecnie robię to w kontekście IronRouter.route(). Żądanie musi zostać wykonane przy użyciu prawidłowego identyfikatora użytkownika i tokenu uwierzytelnienia w nagłówku. Ja nazywam tę funkcję od wewnątrz Router.route(), które następnie daje mi dostęp do this.user:

### 
    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() 

Kod ten był mocno zainspirowany RestStop i RestStop2. Jest to część pakietu meteorytów do pisania interfejsów API REST w Meteor 0.9.0+ (zbudowany na szczycie Iron Routera). Możesz sprawdzić kompletny kod źródłowy tutaj:

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

Powiązane problemy