1

我正在使用 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

非常感谢任何帮助!

4

2 回答 2

2

有一个问题是 postgres 中的变量类型。如果您将“oauth_expires_at”作为“日期时间”,则应将字符串时间戳转换为日期时间。在 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 一起使用,您可以这样做。我正在使用 rail 的 try 方法来优雅地处理 twitter 或其他社交媒体中没有 expires_at 的情况

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
于 2012-10-16T20:50:16.893 回答
1

PG ::错误:错误:类型时间戳的无效输入语法:“1350424800”

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

并在这里查看http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE,您可以看到一些接受的格式,但没有出现数字 Unix Timestamp列在那里。

因此,您必须首先将值转换/格式化为一种可接受的格式;在 PostgreSQL 中可能有一个功能可以做到这一点……(如果没有,谷歌应该提供帮助)。

于 2012-10-16T20:28:28.133 回答