在Google App-Engine数据存储区中存储客户端oauth2凭据

问题描述 投票:1回答:1

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

BadValueError:属性凭据必须可以转换为凭据实例(位于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)
python-2.7 google-app-engine google-oauth google-cloud-datastore google-api-python-client
1个回答
0
投票

我认为序列化凭据可能存在问题。 我正在寻找正确腌制OAuth2Credentials对象以存储它的方法。 如果找到解决方案,我将对此进行更新。

更新使用OAuth2Credentials.to_json()获得from_json()对象的可序列化版本,然后将其转换回。 存储纯文本可能会引起安全问题。 有关更多信息,请参见会话上的Flask文档,以防万一您需要线索。

© www.soinside.com 2019 - 2024. All rights reserved.