我在Rails api应用程序中使用Knock gem进行JWT身份验证。当我创建一个使用密码的用户时,一切都很好,但是当我点击生成user_token的路由时,出现500错误。敲门宝石对所引用的模型执行Activerecord find_by
(this is from https://github.com/nsarno/knock/blob/master/app/controllers/knock/auth_token_controller.rb)
entity_class.find_by email: auth_params[:email]
会触发此选择语句。
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "test@testuser.ca"], ["LIMIT", 1]]
不幸的是,回报是500
我将select语句放入Postico并手动运行它,但仍然失败。那就是当我发现Postgres不喜欢(支持?)值周围的双引号时。当我将电子邮件的值更改为单引号时,它起作用了
SELECT "users".* FROM "users" WHERE "users"."email" = 'no-reply@testuser.ca' LIMIT 1 ;
在列名两边加双引号似乎没问题。
棘手的事情是,这仅发生在通过数字海洋飞沫建立的生产环境中。我已经设置Capistrano来部署我的应用程序。在本地,用户创建和user_token非常完美。我不确定为什么在运行代码时它会在本地运行,但是当我用Postico打我的本地数据库并尝试相同的语句时,它也会崩溃。
任何有关如何解决此问题或为什么发生这种情况的想法将不胜感激。
发生日志文件
[1cbc2966-b7e9-4630-a7e9-07ba13818f2d] puma (3.12.0) lib/puma/thread_pool.rb:133:in `block in spawn_thread'
I, [2018-07-30T19:56:43.531575 #29634] INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] Started GET "/" for xx.xx.xx.xx at 2018-07-30 19:56:43 +0000
I, [2018-07-30T19:56:43.532229 #29634] INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] Processing by HomeController#index as HTML
I, [2018-07-30T19:56:43.533500 #29634] INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] [active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (0.07ms)
I, [2018-07-30T19:56:43.533660 #29634] INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] Completed 200 OK in 1ms (Views: 0.4ms)
I, [2018-07-30T20:03:11.491431 #29634] INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Started POST "/users/create" for 184.69.39.226 at 2018-07-30 20:03:11 +0000
I, [2018-07-30T20:03:11.492263 #29634] INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Processing by UsersController#create as */*
I, [2018-07-30T20:03:11.492443 #29634] INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Parameters: {"user"=>{"email"=>"test@test.ca", "password"=>"[FILTERED]"}}
D, [2018-07-30T20:03:11.582384 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] (0.1ms) BEGIN
D, [2018-07-30T20:03:11.583996 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] User Exists (0.7ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "test@test.ca"], ["LIMIT", 1]]
D, [2018-07-30T20:03:11.585818 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] User Create (0.4ms) INSERT INTO "users" ("email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["email", "test@test.ca"], ["password_digest", "$2a$10$qyZRU.Sxn9mbPI/AQPMnquyiVFKhX8aG8ClPlYdhxivkPQ5XmX0UO"], ["created_at", "2018-07-30 20:03:11.584946"], ["updated_at", "2018-07-30 20:03:11.584946"]]
D, [2018-07-30T20:03:11.586807 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] (0.6ms) COMMIT
I, [2018-07-30T20:03:11.588042 #29634] INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] [active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (0.07ms)
I, [2018-07-30T20:03:11.588329 #29634] INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Completed 200 OK in 96ms (Views: 1.2ms | ActiveRecord: 5.9ms)
I, [2018-07-30T20:03:15.588367 #29634] INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Started POST "/user_token" for xx.xx.xx.xx at 2018-07-30 20:03:15 +0000
I, [2018-07-30T20:03:15.589280 #29634] INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Processing by UserTokenController#create as */*
I, [2018-07-30T20:03:15.589487 #29634] INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Parameters: {"auth"=>{"email"=>"test@test.ca", "password"=>"[FILTERED]"}, "user_token"=>{"auth"=>{"email"=>"test@test.ca", "password"=>"[FILTERED]"}}}
D, [2018-07-30T20:03:15.591732 #29634] DEBUG -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "test@test.ca"], ["LIMIT", 1]]
I, [2018-07-30T20:03:15.667905 #29634] INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Completed 500 Internal Server Error in 78ms (ActiveRecord: 0.4ms)
F, [2018-07-30T20:03:15.669634 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4]
F, [2018-07-30T20:03:15.669803 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] TypeError (no implicit conversion of nil into String):
F, [2018-07-30T20:03:15.669896 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4]
F, [2018-07-30T20:03:15.669994 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:75:in `digest'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:75:in `sign_hmac'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:36:in `sign'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:96:in `encoded_signature'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:106:in `encode'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] knock (2.1.1) app/model/knock/auth_token.rb:14:in `initialize'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] knock (2.1.1) app/controllers/knock/auth_token_controller.rb:22:in `new'
进一步调查
我将本地环境转换为“生产”模式,并在本地创建了生产数据库。遇到同样处于生产模式的VPS时,我也会遇到500个内部服务器错误!这似乎是Active Record的开发和生产及其与PostgreSQL的工作方式之间的区别?
仍然试图弄清楚这一点,如果有人对此有任何经验,请告诉我:)
答案 0 :(得分:0)
查询很好,并且与您的问题无关。
您的日志输出显示与Postgres无关的错误:
TypeError (no implicit conversion of nil into String):
jwt (1.5.6) lib/jwt.rb:75:in `digest'
jwt (1.5.6) lib/jwt.rb:75:in `sign_hmac'
jwt (1.5.6) lib/jwt.rb:36:in `sign'
jwt (1.5.6) lib/jwt.rb:96:in `encoded_signature'
jwt (1.5.6) lib/jwt.rb:106:in `encode'
knock (2.1.1) app/model/knock/auth_token.rb:14:in `initialize'
knock (2.1.1) app/controllers/knock/auth_token_controller.rb:22:in `new'
答案 1 :(得分:-1)
问题似乎源于Rails不再使用机密,而是使用5.2中的凭据
这是Knock的github问题 https://github.com/nsarno/knock/issues/205