2009-06-23 1 views
1

내 앱을 사용하려면 사용자가 Google 계정을 사용하여 로그인해야합니다.처음으로 사용자 로그인을 애플리케이션 (Google Appengine)에 감지하기

내 App.yamp 파일에서이 세트를 가지고 :

  • URL을 : user.py
    로그인 : 필요한

이제 때 모든 사용자를
스크립트 /user/.* /user/secret.py 아래의 파일에 액세스하려고 시도합니다. Google을 통해 인증해야합니다. 그러면 인증 성공 후 사용자가 /user/secret.py로 리디렉션됩니다. 지금 내가 직면하고있는 문제는 사용자가 다시 앱으로 리디렉션 될 때입니다. 사용자가 처음 로그인했는지 또는 내 사이트의 일반 사용자인지, 단지 사용자로부터 다시 방문했는지는 확실하지 않습니다. Google이 users.get_current_user()를 사용하여 전달하는 객체입니다.

그래서 사용자가 이미 존재하는지 여부를 확인하기 위해 데이터 저장소에 상태를 유지해야합니다. 그가 존재하지 않으면 다른 응용 프로그램 특정 설정으로 새 항목을 만들어야합니다.

제 질문은 : 이것을 처리하는 좀 더 쉬운 방법이 있습니까? 데이터 저장소를 쿼리하지 않아도 처음 사용자 또는 일반 사용자인지 파악할 수 있습니다.

답변

1

처음으로 사용자가 로그인하여 이것을 확인하면 쿠키를 설정할 수 있습니까? 그들이 새로운 사용자라면 거기에 없을 것이지만 그들이 오래된 사용자라면 그렇게 될 것입니다. 일부 사용자는 쿠키를 지울 수 있기 때문에 100 % 정확하지는 않지만 원하는 것은 무엇인지에 따라 달라질 수 있습니다.

응용 프로그램에서 장고를 사용하는 경우 managing Cookies is pretty straightforward.

+0

쿠키는 좋은 대안입니다. 앱 클래스에 사용자 클래스의 속성과 같이 직접 말해 줄 수있는 무언가가 있었으면 좋겠습니까? – MathOldTimer

+0

쿠키는 나쁜 생각입니다. 새 브라우저를 사용하거나 쿠키를 삭제 한 기존 사용자가 새 사용자로 표시됩니다. –

2

아니요, 사용자가 이전에 앱에 로그인했는지 여부는 Google에서 추적하지 않습니다. 아마도 사용자에 대해 일종의 상태를 저장해야하기 때문에 가장 간단한 방법은 데이터 저장소에서 사용자의 레코드를 가져오고 시도하는 것입니다. 고객이없는 경우 등록 화면으로 보내 정보를 수집 할 수 있습니다. Memcache를 사용하여 사용자의 정보를 캐시하고 추가 데이터 스토어 왕복을 피할 수 있습니다.

2

나는 내 웹 핸들러 나는 장식라는 세션 하나라는 권한 부여를 연결합니다 들어 내 자신의 사용자 및 세션 manangement

를 사용하는 경향이있다. 세션 데코레이터는 모든 요청에 ​​세션을 첨부하고 권한 부여 데코레이터는 사용자가 권한이 있는지 확인합니다.

(신중한 말로 권한 부여 데코레이터는 내 응용 프로그램을 개발하는 방법과 관련이 있습니다. 대부분의 요청에 매개 변수)

그래서 예를 들어 웹 핸들러처럼 보일 수 있습니다 : 위의 코드에서

class UserProfile(webapp.RequestHandler): 
    @session 
    @authorize 
    def get(self, user): 
    # Do some funky stuff 
    # The session is attached to the self object. 
    someObjectAttachedToSession = self.SessionObj.SomeStuff 
    self.response.out.write("hello %s" % user) 

는 세션 장식 내가에 존재하는 쿠키를 기반으로 할 몇 가지 세션 물건을 첨부 의뢰. 권한 부여 헤더는 세션이 올바른 경우에만 사용자가 페이지에 액세스 할 수 있는지 확인합니다.

데코레이터 코드는 다음과 같습니다 :

import functools 
from model import Session 
import logging 

def authorize(redirectTo = "/"): 
    def factory(method): 
     'Ensures that when an auth cookie is presented to the request that is is valid' 
     @functools.wraps(method) 
     def wrapper(self, *args, **kwargs): 

      #Get the session parameters 
      auth_id = self.request.cookies.get('auth_id', '') 
      session_id = self.request.cookies.get('session_id', '') 

      #Check the db for the session 
      session = Session.GetSession(session_id, auth_id)   

      if session is None: 
       self.redirect(redirectTo) 
       return 
      else: 
       if session.settings is None: 
        self.redirect(redirectTo) 
        return 

       username = session.settings.key().name() 

       if len(args) > 0:    
        if username != args[0]: 
         # The user is allowed to view this page. 
         self.redirect(redirectTo) 
         return 

      result = method(self, *args, **kwargs) 

      return result 
     return wrapper 
    return factory 

def session(method): 
    'Ensures that the sessions object (if it exists) is attached to the request.' 
    @functools.wraps(method) 
    def wrapper(self, *args, **kwargs): 

     #Get the session parameters 
     auth_id = self.request.cookies.get('auth_id', '') 
     session_id = self.request.cookies.get('session_id', '') 

     #Check the db for the session 
     session = Session.GetSession(session_id, auth_id)   

     if session is None: 
      session = Session() 
      session.session_id = Session.MakeId() 
      session.auth_token = Session.MakeId() 
      session.put() 

     # Attach the session to the method 
     self.SessionObj = session   

     #Call the handler.   
     result = method(self, *args, **kwargs) 

     self.response.headers.add_header('Set-Cookie', 'auth_id=%s; path=/; HttpOnly' % str(session.auth_token)) 
     self.response.headers.add_header('Set-Cookie', 'session_id=%s; path=/; HttpOnly' % str(session.session_id)) 

     return result 
    return wrapper 

def redirect(method, redirect = "/user/"): 
    'When a known user is logged in redirect them to their home page' 
    @functools.wraps(method) 
    def wrapper(self, *args, **kwargs): 
     try:  
      if self.SessionObj is not None: 
       if self.SessionObj.settings is not None: 
        # Check that the session is correct 
        username = self.SessionObj.settings.key().name() 

        self.redirect(redirect + username) 
        return 
     except: 
      pass 
     return method(self, *args, **kwargs) 
    return wrapper 
1

나는 자신의 인증 된 사용자를 관리하는 것이이 문제를 접근하는 가장 좋은 방법입니다 것에 동의합니다.응용 프로그램 범위에 따라 다르지만 최소한 계정에 로그인 한 사용자에 대한 UserProperty가 포함 된 AuthUser (Model) 클래스가 있어야합니다.

... 
class AuthUser(db.Model): 
    user = UserProperty(required=True) 
... 

그런 경우 사용자가 다른 방법으로 단지

... 
user = users.get_current_user() 
user_exists = AuthUser.gql('where user = :1', user) # or easy check db.GqlQuery("select __key__ from AuthUser where user = :1", user) 
if user_exists: 
    # do user has been before stuff 
else: 
    # do first time user stuff 
... 

이것은 ListProperty (users.User)가 귀하의 사이트에 대한 모델을 가지고있다 할 수있는 매우 쉬운 방법으로 로그와는 쉽게 할 수 이전에 사용자가 앱에 들어 갔는지 확인하려면 목록을 확인하십시오.

... 
class SiteStuff(db.Model): 
    auth_users = ListProperty(users.User) 
... 

로그인 할 때 : 목록에 있는지 확인하십시오. 그렇지 않다면, 목록에 추가하고, put()하고, 처음 사용자에게해야 할 일을하십시오. 거기에서 그들을 발견하면 다른 것들을하십시오.

관련 문제