我正在编写一个代表注册用户离线访问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)
我认为序列化凭据可能存在问题。 我正在寻找正确腌制OAuth2Credentials对象以存储它的方法。 如果找到解决方案,我将对此进行更新。
更新使用OAuth2Credentials.to_json()获得from_json()对象的可序列化版本,然后将其转换回。 存储纯文本可能会引起安全问题。 有关更多信息,请参见会话上的Flask文档,以防万一您需要线索。