1

我正在代表注册用户编写一个离线访问 Google API 的应用程序。注册过程会收集基本帐户信息,例如公司名称、联系 Eamil 等。然后引导用户完成 OAuth2 过程,最终获得用户的 OAuth2 凭据。我想将所有这些数据、企业名称、联系人电子邮件和 OAuth2 凭据保存在同一个数据存储实体中。但是,当我尝试调用 Model.put(); 时,我遇到了这个奇怪的错误。

BadValueError:属性凭据必须可转换为凭据实例(<oauth2client.client.OAuth2Credentials 对象位于 0xb595facc>)

我的 Oauth 回调函数如下所示。您可以看到我尝试过使用 StorageByKeyName() 但它给出了同样的错误。

注意我不确定这是否重要,但在我调用 ua.put() 时,实体尚未创建。我已经看到了其他非常相似的代码,其中在分配凭证属性时实体已经存在。

class Oauth2callback(BaseHandler):
    def get(self):
        user    = users.get_current_user()
        flow    = pickle.loads(memcache.get( user.user_id() ))
        if flow:
            # Store UserAccount
            credentials = flow.step2_exchange(self.request.params)
            pa = models.ParentAccount.get_account_by_token('XXXXXXXXXX')
            ua = models.UserAccount(
                key_name        = user.user_id(),
                account_email   = user.email(),
                parent_account  = pa,
                credentials     = credentials,
            )
            ua.put()

            # Try Storing Credentials Separately
            # credentials = flow.step2_exchange(self.request.params)
            # storage = StorageByKeyName(models.UserAccountCredentials, user.user_id(), 'credentials')
            # storage.put(credentials)

谢谢

这是模型定义。

class UserAccount(db.Model):
    status_states       = ["IN-ACTIVE","ACTIVE", "PAUSED", "DELETED"]

    account_email       = db.StringProperty(required=False)
    contact_email       = db.StringProperty(required=False)
    business_name       = db.StringProperty(required=False)
    create_date         = db.DateTimeProperty(auto_now_add=True)
    account_settings    = db.StringProperty(required=False) # JSON config data MAX 500 characters. Change type: 'Text' for larger values and to avoid indexing.
    parent_account      = db.ReferenceProperty(ParentAccount, collection_name = "children", required=False)
    status              = db.StringProperty(required=True, default = "ACTIVE", choices=set(status_states))
    original_status     = db.StringProperty(required=True, default = "ACTIVE", choices=set(status_states))
    credentials         = CredentialsProperty(required=False)
4

1 回答 1

0

我认为序列化凭据可能存在问题。我正在寻找正确腌制 OAuth2Credentials 对象来存储它。如果我找到解决方案,我会更新这个。

更新使用 OAuth2Credentials.to_json() 获取对象的可序列化版本 from_json() 将其转换回来。存储纯文本可能会引起安全问题。如果您需要引导开始,请参阅有关会话的 Flask 文档以获取更多信息。

于 2015-04-03T02:59:40.647 回答