1

ユーザーが認証やカスタムユーザー登録にOauth2を使用できるようにするアプリケーションがあります。すべてのユーザーは、データストアのデフォルトのユーザー エンティティに保存されます。ユーザーが Oauth2 を使用して初めてログインする場合、デフォルトの User エンティティに新しいレコードが次のように作成されます。

  """Check if user is already logged in"""
  if self.logged_in:
    logging.info('User Already Logged In. Updating User Login Information')
    u = self.current_user
    u.auth_ids.append(auth_id)
    u.populate(**self._to_user_model_attrs(data, self.USER_ATTRS[provider]))
    u.put()
  else:
    """Create a New User"""
    logging.info('Creating a New User')
    ok, user = self.auth.store.user_model.create_user(auth_id, **self._to_user_model_attrs(data, self.USER_ATTRS[provider]))

    if ok: 
      self.auth.set_session(
        self.auth.store.user_to_dict(user)
      )   
self.redirect(continue_url)

カスタム登録の場合、レコードは次のハンドラを介して挿入されます。

class RegistrationHandler(TemplateHandler, SimpleAuthHandler):

  def get(self):
    self.render('register.html')

  def post(self):
    """Process registration form."""
    user = 'appname:%s' % self.request.get('email')
    name = '%s %s' % (self.request.get('first_name'), self.request.get('last_name'))
    password = self.request.get('password')
    avatar = self.request.get('avatar')
    act_url = user_activation.Activate(self.request.get('first_name'), self.request.get('email'))
    ok, user = User.create_user(auth_id=user, name=name, password_raw=password, email=self.request.get('email'))
    if ok: 
      self.auth.set_session(self.auth.store.user_to_dict(user))
      acc = models.Account(display_name=self.request.get('first_name'), act_url=act_url, act_key=act_url.split('activate/')[1], user=users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).email))
      acc.put()
      if avatar:
        avt = models.Picture(is_avatar=True, is_approved=True, image=avatar, user=users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).email))
        avt.put()
    self.redirect('/')

現在、セッション処理に webapp2_extras.sessions を使用しています。コメント、画像、レビューなど、作成者フィールドとして db.UserProperty() を使用したいさまざまなモデルがあります。ただし、「users.get_current_user()」を使用してこれらのモデルのいずれかにレコードを入力すると、作成者フィールドは空白またはなしと表示されます。これは、webapp2 セッションを介してセッションを処理しているためだと思います。

私たちが達成したいのは、さまざまなモデルで db.UserProperty フィールドを使用し、webapp2 セッションを使用して現在のユーザーに適切にリンクできるようにすることです。

レコードを適切に挿入するには、UserProperty() をユーザー オブジェクトと共に渡す必要があります。次のコードを使用してレコードを入力できますが:

user = users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).email)

また

user = users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).name)

しかし、model.author を参照してユーザー オブジェクト全体を取得することはできません。

これを達成する方法はありますか?

4

2 に答える 2

4

OAuth 2.0は、現在ユーザーサービスではサポートされていません。サポートされているオプションは

  • Googleアカウント
  • OpenId
  • OAuth 1.0

コードベースにdb.Userを導入することで、あなたが何を達成しようとしているのかを率直に理解していません。あるとすればself.current_user、あなたはすでに認証プロセスを処理していると思います。

あなたがそうするときself.auth.store.user_model.create_user-それはすでにあなたにwebapp2のユーザーオブジェクト/エンティティを与えます(しかしそれはdb.Userとは何の関係もありません)。これが、OAuth2.0の制約がある場合に作成者フィールドとして使用する必要があるものだと思います。

users.get_current_user()特別なCookie(App Engine内部)に依存しています。実際、それはwebapp2のセッション(またはその他の「カスタム」セッション)とは何の関係もありません。Cookieを、App Engineの内部が理解できる値に設定し、ユーザーが前述のいずれかの方法でログインしているかのようにだまされることで、ハッキングすることができますが、このアプローチはお勧めしません。文書化されておらず(Cookie名、形式など)、いつでも変更される可能性があります。

于 2012-06-16T15:24:15.367 に答える
2

UserProperty を使用して webapp2 ユーザー オブジェクトへの参照を格納する代わりに、auth_id を StringProperty として格納し、対応する webapp2 ユーザー エンティティを取得するための便利なメソッドを追加する必要があります。

このようなもの

from webapp2_extras.appengine.auth.models import User

class Comment(db.model):
  text = db.StringProperty()
  author = db.StringProperty()

  def get_author(self):
    return User.get_by_auth_id(self.author)
于 2012-06-29T03:24:53.287 に答える