我应该如何解析Facebook Oauth令牌的过期日期以存储在PostgreSQL中?

时间:2012-10-16 20:07:43

标签: ruby-on-rails facebook postgresql oauth

我正在使用OAuth对我的应用进行身份验证,以使用OAuth访问用户的Facebook详细信息。最近,我迁移了数据库以使用PostgreSQL,现在从Facebook返回时存储令牌信息时遇到了麻烦。

确切的错误是:

PG::Error: ERROR:  invalid input syntax for type timestamp: "1350424800"
: INSERT INTO "authentications" ("created_at", "oauth_expires_at", "oauth_token", "provider", "uid", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"

奇怪的是,这不是SQLite的情况,所以它显然与Facebook返回到期日期(“1350424800”)的格式有关。有关我应如何解析它以使其工作的任何想法?

我对目前创建的方式并没有做任何巧妙的事,只是:

def self.create_with_omniauth(auth)
    create(uid: auth['uid'], provider: auth['provider'], oauth_token: auth['credentials'].token, oauth_expires_at: auth['credentials'].expires_at)
end

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:2)

postgres中的变量类型存在问题。如果您将'oauth_expires_at'作为'datetime',则应将字符串时间戳转换为日期时间。在Rails中,您可以使用Time.at轻松转换它,如下所示:

  

... oauth_expires_at:Time.at(auth ['credentials']。expires_at)

按如下方式重写您的功能:

def self.create_with_omniauth(auth)
    create(uid: auth['uid'], provider: auth['provider'], oauth_token: auth['credentials'].token, oauth_expires_at: Time.at(auth['credentials'].expires_at))
end

如果你想要更多的灵活性并使用omniauth-twitter,你可以做这样的事情。当twitter或其他社交媒体中没有expires_at时,我正在使用rails的try方法来优雅地处理案例

class User < ActiveRecord::Base
    has_many :authentications, dependent: :destroy

    def create_authentication(oauth)
        authentications.create!(
            provider: oauth['provider'], 
            uid: oauth['uid'], 
            oauth_token: oauth['credentials']['token'],
            oauth_secret: oauth['credentials'].try(:[],'secret'),
            oauth_token_expires_at: oauth['credentials'].try(:[],'expires_at') ? Time.at(oauth['credentials'].try(:[],'expires_at')) : nil,
            data: oauth.to_json.to_s
        )
    end 
end

答案 1 :(得分:1)

  

PG ::错误:错误:类型为timestamp的输入语法无效:“1350424800”

这里有一个nummeric Unix Timestamp值 - 而PostgreSQL数据类型timestamp显然必须以另一种格式给出。

在这里看http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE,你可以看到一些可接受的格式,但是那里似乎没有列出数字的Unix时间戳。

因此,您必须先将值转换/格式化为一种可接受的格式;在PostgreSQL中可能有一个设计用于执行此操作的功能...(如果没有,Google应该提供帮助)。