2013-11-26 1 views
8

사용자가 로그인했는지 서버 측 경로에서 어떻게 확인할 수 있습니까?Iron-router 서버 측의 Meteor.user()

'before'에 체크를 추가 하겠지만 Metor.user()는 여기서 작동하지 않습니다.

미리 감사드립니다.

p.s. How to get Meteor.user() to return on the server side?을 찾았지만 철제 라우터에서 작동하지 않습니다.

+0

뿐만 아니라,하지만하지 않았다 : 당신은 여기에 완전한 소스 코드를 확인할 수 있습니다. 나는 Meteor 방법을 쓰는 것을 끝내었다. 이것은 이상적인 것은 아니지만 적어도 제 경우에는 제 문제에 대한 실행 가능한 해결책이었습니다. –

답변

8

나는 이것이 가능하지 않을까 걱정됩니다. 이 문제는 두 가지 다른 프로토콜 (문자 그대로 또는 논리적)을 사용하여 서버에 연결하려고한다는 사실에서 비롯된 것입니다. 따라서이 두 가지 작업을 관련시키는 확실한 방법은 없습니다.

그러나 사용자의 요구에 맞는 매우 간단한 솔루션이 있습니다. 당신은 특권 토큰이나 비밀 키 등의 간단한 시스템을 개발해야합니다. 첫째, HTTP 헤더 내에서 또는 URL 그 자체로 하나, 당신은 지금 당신의 AJAX 요청 (또는 무언가)에 부착 secretKey를 얻기 위해 클라이언트에서 사용할 수 있습니다, 그리고 서버 방법

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

을 만들 수 있습니다. 두려워하지 마라! HTTPS을 사용하는 경우 모두 암호화됩니다.

서버 측에서는 들어오는 요청에서 secretKey을 검색하고 Secrets 컬렉션에 있는지 확인할 수 있습니다. 사용자에게 특정 권한이 부여되었는지 여부를 알 수 있습니다. 또한 보안상의 이유로 잠시 후 컬렉션에서 비밀 키를 제거 할 수 있습니다.

+0

설명 및 솔루션을 주셔서 감사합니다 – elbowz

+0

여기 예제 : https://github.com/apendua/meteor-uploader/blob/master/server.js 서버 측 경로에 connectHandlers를 사용하고있는 것 같습니다. 서버 측 경로에도이 방법을 권장할까요? Iron Router를 사용하고 있으며 토큰으로 수행중인 작업에 접근 할 수 있는지 알고 싶습니다. – Aaron

+0

또한 귀하의 솔루션 (링크에 있음)에 토큰 또는 토큰의 만료를 저장하는 데이터베이스가 포함되어 있지 않음을 알았습니까? – Aaron

3

당신이하고자하는 일은 IronRouter.route()의 컨텍스트 내에서 요청을하는 Meteor.user를 인증하는 것입니다. 요청은 헤더에 유효한 사용자 ID 및 인증 토큰을 사용하여 이루어져야합니다. 내가 Router.route() 내에서이 함수를 호출하는 다음 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() 

이 코드는 크게 RestStop 및 RestStop2에 의해 영감을했다. Meteor 0.9.0+ (Iron Router 위에 구축 됨)에 REST API를 작성하기위한 유성 패키지의 일부입니다. 나는이 작업을 얻으려고 노력했다

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