Heroku + rails4.2 + Deviseで本番環境,ログアウト画面に遷移する際にエラー

投稿者: Anonymous rails4.2 + Deviseで,本番環境のみで発生するエラーです. rake assets:precompile でプリコンパイル後に git push heroku master で立ち上げると,ログイン画面が表示されるところまでは確認しました. ログイン後,ログアウトを図ると The page you were looking for doesn’t exist. You may have mistyped the address or the page may have moved. If you are the application owner check the logs for more information. というエラーが吐かれてしまいます. こちらがGemfileの一部抜粋になります. # Bundle edge Rails instead: gem ‘rails’,…(Continue Reading)

Rails4+Deviseのユーザ情報編集画面のフォームから受け取った値を書き換えて保存したい。

投稿者: Anonymous Rails4+Deviseでログインできるウェブサービスの練習をしています。 rails g devise user rails g migration add_columns_to_users image により、ユーザ画像のURLを持つimageカラムをuserモデルに追加し rails g devise:views によって生成されたusers#editのテンプレートファイルのform_forの中に <%= f.hidden_field :image %> を追加して、imageカラムの更新をusers#editからできるようにしようとしています。 このとき、input type=’hidden’タグのvalueの中身は、 javascriptの他のプログラムによってcanvasのtoDataURL()の内容が入るようになっています。 toDataURL()によって出力されたDataURL文字列をそのままデータベースに保存しても動くとは思うのですが できれば、サーバ側で受け取ったDataURL文字列をファイルに変換出力して、 そのファイルのURLをimageカラムの情報として持たせたいと思っています。 (現在imageカラムは通常のstring型なのでdata too long for column ‘image’…などのエラーもでます) さきほどまで、users#editから送信されたimageのデータを受け付けることもしてくれなかったのですが application_controller.rbに devise_parameter_sanitizer.for(:account_update) << :image を記述することにより、どうやらデータを受け付けることはできたようです。 しかし、このままだと受け取ったデータをそのままデータベースに受け渡してしまうだけで 受け取ったデータを書き換えることができていません。 DataURL文字列をファイル変換出力しURLを取得するメソッドは出来上がっているので その関数に、いくつかの情報を渡すだけでURLを取得できるのであと一歩なのですが ユーザ情報編集画面のフォームから受け取った値を書き換えて保存するにはどうすればよいのでしょうか。 追記 現在、以下で教えて頂いた フォームの要素名を変更してuserモデルにgetterを作成して受け取る方法を試しています。 DataURL文字列をファイル変換出力するメソッドに関しては、その他のControllerなどで 利用することもあるので、Imageモデルのクラスメソッドとして定義しました。 これにより、userモデルのgetterメソッドが呼ばれた時にファイルを保存することが出来たのですが 保存する画像のファイル名にユーザIDを利用したく‌​て、userモデルのgetterからcurrent_userにアクセスしてみたところcurrent_userの値にアクセスできないという問題に突き当たっています。 userモデルにgetterを作成する方法も発想として無かったのですごくためになっているのですが やはりcontr‌​ollerにコードを書いてuserモデルに渡してあげるべきなのではないかと悩んでいます。 users#editから送信されたデータがDeviseのControllerのどの部分に届くのか、さっぱりわからないのですが(そもそもControllerが存在しない?rails…(Continue Reading)

Gemfile 内のソースコードのメソッドの探し方について

投稿者: Anonymous devise gem の authenticate_user がなぜか正常なアカウントに対して 401 を出すようになったので ソースコードにデバッグを挟んでどこのどの値がおかしいのかしらべようとしたんですが devise のリポジトリ内でこのメソッドを検索しても定義場所が見当たりません authenticate_user! の検索結果 helper メソッドのようなので app/helpers/devise_helper.rb もみてみたんですがメソッドは見当たりません require ‘devise’ authenticate_user! と書いたときに呼ばれるコードはどうやって gem のリポジトリから探せばいいのでしょうか… /usr/local/bundle/gems/devise-4.7.1/lib/devise/controllers/helpers.rb に def authenticate_#{group_name}!(favourite=nil, opts={}) unless #{group_name}_signed_in? mappings = #{mappings} mappings.unshift mappings.delete(favourite.to_sym) if favourite mappings.each do |mapping| opts[:scope] = mapping warden.authenticate!(opts) if !devise_controller? || opts.delete(:force) end end end def #{group_name}_signed_in? #{mappings}.any?…(Continue Reading)

2つのRailsアプリケーション間でセッションを共有したい

投稿者: Anonymous この投稿は下記ページの転載です。 https://teratail.com/questions/61778 Rails3で稼働しているアプリケーションをRails5にアップデートしようと思っています。 Rails5のプロジェクトを新規作成し、現状のアプリケーションと同じサーバー内で2つを並行稼動させ、Nginx側でURLによるルーティングをすることで徐々に5へ移行していくような計画をたてています。 静的なページはこれでうまく動いているのですが、ログインが必要なページでセッションが共有されず困っています。 Rails3とRails4以降ではセッション暗号化の仕組みが変わっているようなので、下記の記事を参考に設定を行いました。 https://medium.com/ruby-on-rails/3-steps-to-share-a-session-between-rails-3-and-rails-4-applications-9618766e6c2a#.udvo3a58p 1. 新旧Railsでセッションストアの設定を統一 # config/initializers/session_store.rb Rails.application.config.session_store :cookie_store, key: ‘example.net_session’ 2. Rails5のcookie形式をjsonからmarshalに変更 Rails.application.config.action_dispatch.cookies_serializer = :marshal # default: :json 3. Rails5のsecret_key_baseの設定を消し、代わりにsecret_tokenを設定 secret_tokenはRails3のconfig.secret_token と同じ値です development: # secret_key_base: abc123… secret_token: 123abc… 4. Deviseのsecret_keyを設定 これも新旧Railsで共通の値を入れています Devise.setup do |config| config.secret_key = “xyz123” ~~~ end 設定は以上です。 ローカルで2つのRails(WEBrickとPuma)をdocker内で立ち上げ、本番と同じようにNginxでURLによってproxy_passを振り分けるという方法でテストしています。 Rails3側でログインし、次にRails5側で実装済みのページに移動するとcookieが書き換えられてしまい、非ログイン状態に戻ってしまいます。 他に試すべきこと、確認事項などあれば些細な事でも結構ですので、助言を頂けると幸いです。よろしくお願いします。 解決 自己解決しました。 セッションが共有できなかった原因は、Rails3の方でdevise-encryptableを導入していたからでした。解決方法は下記になります。 Rails5のGemfileにdevise-encryptableを追加しbundle install…(Continue Reading)

devise から sorcery への移行について

投稿者: Anonymous devise から sorcery に移行できるかどうかを検討しています。 とくにdeviseでencryptしたパスワード(デフォルトのbcryptを利用しています)をsorceryに移行できるかどうかについて知見がある方がいらっしゃればアドバイスをいただきたいです。 以下は確認済みです。 deviseでencryptした値をsorceryで使いまわすことができない crypted_passwordカラムの値をcrypted_passwordカラムに入れてもログインできないことは確認済み 解決 devise, sorceryともにsaltの保存場所が異なる sorceryはsaltカラムに、deviseはcrypted_passwordにそれぞれ保存 以下の記事にあるようにbcryptではencryptしたパスワードを復元することができない https://stackoverflow.com/questions/15253796/decrypting-a-devise-password/15254056#15254056 上記の点からdeviseからsorceryへの移行は現実的ではないという結論に至りました。 回答者: Anonymous

rails の devise でパスワードの復号化はできる?

投稿者: Anonymous rails でパスワード認証を実装する場合には、 devise が一般的に使われる、という理解をしています。 ふと devise の仕様について気になったのですが、 devise でテーブルに保存されたパスワード情報を使って、元の生パスワードを復元することはできますか?(devise の暗号化は、可逆ですか?) 解決 デフォルトのdeviseのパスワード暗号は不可逆です。 暗号化にはBcryptといういのが使われています。 一般に忘れてしまったパスワードはパスワードリセットメールを送り、再設定させますね。 安全性が気になるところではありますが、以下のような復号化ができるdeviseのエクステンションgemはあります。 https://github.com/chicks/devise_aes_encryptable こちらはAESが使われています。 ただ、他のところでも言われていますが、パスワードは復号化できない方がセキュリティ的にはベターです。 回答者: Anonymous

RailsのDeviseサインアップ時に、特定のメールアドレスにもメールを送信するやり方を教えてください

投稿者: Anonymous やりたいこと RailsのDeviseサインアップ時に、登録してくれたユーザのメールアドレスと、特定のメールアドレスにメールを送信するやり方を教えてください。 Deviseで新規登録時に 登録してくれたユーザのメールアドレス [email protected] の2つにメールが届くようにしたいです。 登録してくれたユーザにはメールを送信できるのですが、特定のメールアドレス、「2」の「[email protected]」にもメールを送信するやり方がわかりません。どのように設定すれば良いのでしょうか? 宜しくお願い致します。 解決 Devise::Mailer を継承したカスタムメーラクラスを作成し、その中で Cc を設定すると良いでしょう。 config/initializers/devise.rb: Devise.setup do |config| … config.mailer = “MyMailer” … end app/mailers/my_mailer.rb: (全てのメールにCcを付ける場合) class MyMailer < Devise::Mailer default :cc => “[email protected]” end (特定のメールにCcを付ける場合) class MyMailer < Devise::Mailer def confirmation_instructions(record, token, opts={}) super(record, token, opts.merge(:cc => “[email protected]”) end end ※実際にはハードコーディングせず、別ファイルなどで定義するべきです。 参考: https://github.com/plataformatec/devise/wiki/How-To:-Use-custom-mailer…(Continue Reading)

Rails ActiveAdmin のログインができなくなった・・・

投稿者: Anonymous ruby on rails activeadmin を導入し、管理者ユーザーの登録やダッシュボードの生成など行いました。 少し時間を空けてactiveadminにログインしようと思ったら、ログインができなくなりました。 初期の [email protected] password は削除して、自分の設定していました。 自分で設定した アドレスやパスワード に間違いはありません。 パスワードリセットの画面に飛び、メールアドレスを入力するとアドレスはない と弾かれてしまいます。 何か解決方法はありますでしょうか? もしくは、再設定する方法などありますでしょうか??? 解決 まず、DBのadmin_usersテーブル(デフォルトではadmin_usersですが、もし変更していたら読み替えてください)に管理者のレコードが登録されているはずですので、登録されているemailを確認してみてください。 そのemailでパスワードの再設定を行うとパスワード変更できると思います。 admin_usersが空だったりした場合は、seedなどで管理者データを作り直してログインすれば良いかと思います。 回答者: Anonymous

Deviceを使用したアプリで、Rspecを用いてテストする場合

投稿者: Anonymous 初めて、Deviceを使用したアプリで、Rspecを用いてテストしようとしています。 はじめにコントローラーのテストファイルに、以下を追加して、正常なレスポンスが帰ってくるかのテストをしようとしています。 it “returns a 200 response” do get :index expect(response).to have_http_status “200” end その結果、以下のようなエラーが出ました。 Devise::MissingWarden: Devise could not find the `Warden::Proxy` instance on your request environment. Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack. If you are…(Continue Reading)

deviseでtwitterログイン機能を実装するにあたりpassword_required?のメソッドで躓いてます。

投稿者: Anonymous ruby 2.2.2p95 Rails 4.2.5 mac yosemite deviseでtwitterログインの機能を実装しております。 以下のページを参考にTwitter認証時はパスワードを要求しないようにpassword_required?というメソッドを作りました。 http://qiita.com/cigalecigales/items/a98be8416bf169ce5942 ただ、twitterの認証は成功するものの、いつもパスワードの入力欄が表示されており困っております。 binding.pryで確認したところtrueになっているのが原因かと思います。 “` [1] pry(#)> super => true [8] pry(#)> super.class => TrueClass “` しかし、このsuperが何をしているのかが、今の私の知識量ではわからず、 deviseのソースコードを読んでみたり、ググッてもわからなかったため質問させて頂きました。 宜しくお願いします。 ※twitter連携機能自体は実装されており、上手く連携されております。 連携時はパスワード欄を隠したいというところだけが上手く行ってません。 解決 Qiitaに載っているコードは以下のようになっています。 class User < ActiveRecord::Base # (省略)… def password_required? super && provider.blank? end end password_required?メソッドの実装はおそらく、 親クラスのルールにおいてパスワード入力が必須(super) かつ(&&)、providerが未指定(provider.blank?) であれば、パスワード入力を必須とする という意味だと思います。 このsuperが何をしているのかが、今の私の知識量ではわからず superは親クラスの同名メソッド(つまりpassword_required?)を呼びだしています。 具体的にはDeviseの中で実装されているメソッドです。 https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L50 #…(Continue Reading)

特定のユーザーのログインを再現する方法

投稿者: Anonymous RailsでDeviseを使ったユーザー認証を実装しています。 特定のユーザーが他のテスト用のユーザーでは再現しないエラーを抱えているという報告があったのですが、この場合そのユーザーでログインした場合の画面情報を確認するにはどのような方法ありますか? 自分のやり方ですとローカルにDBをコピーして、パスワードがわかってるユーザーのencrypted_passwordを該当ユーザーのencrypted_passwordに入れる、というものですがもうちょっとスマートな方法はないでしょうか? 解決 Adminのbecome機能 管理画面にbecome機能を実装するのはどうでしょうか。 DeviseのWikiのHow Toを集めたページ How Tos · plataformatec/devise Wiki の中に 「もしアドミンユーザなら他のユーザになる方法」 How To: Sign in as another user if you are an admin · plataformatec/devise Wiki が記載されています。 一度実装してしまえば、該当ユーザの(成り代わったユーザの)画面情報にとどまらず画面からの操作が可能です。 実装完了してしまえば、直接DB操作することなく全てWebブラウザの画面で完結することができます。 もし本番で不用意に他のユーザに変わりたくないというのであれば、ローカルだけ(development環境だけ)この機能が使えるようにしておくなど方法があると思います。 一部引用かつ翻訳 「もしアドミンユーザなら他のユーザになる方法」 How To: Sign in as another user if you are an admin · plataformatec/devise Wiki class AdminController…(Continue Reading)

devise で新規登録だけを禁止したい

投稿者: Anonymous Railsとdeviseでユーザーの新規登録のみできないようにする こちらにどんぴしゃの記事があったので真似して user.rb から registable を削除 route.rb に as :user do get ‘users/edit’ => ‘devise/registrations#edit’, :as => ‘edit_user_registration’ put ‘users’ => ‘devise/registrations#update’, :as => ‘user_registration’ end というのを追加したところ registable を消す前は1度は正常表示できた edit 画面で NoMethodError in Devise::Registrations#edit Showing /home/chico/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/devise-i18n-views-0.3.7/app/views/devise/registrations/edit.html.erb where line #3 raised: undefined method `registration_path’ for #<#<Class:0x000055dcd4a26938>:0x000055dcd4a300c8> というエラーになってしまいます rails routes をみると edit_user_registration GET /users/edit(.:format) devise/registrations#edit…(Continue Reading)

WEBのLINEログインで”redirect_uri does not match”

投稿者: Anonymous WEBアプリのLINEログインでトークンを取得するとこで{“error”:”invalid_grant”,”error_description”:”redirect_uri does not match”}というエラーでトークンの取得に失敗します。 Rails5+devise+omniauth-lineで試してますが、多分その辺の問題は余り関係無いような気がしています。ローカルで試しているのでngrokを使って試しています。 LINE側のログイン画面は下記のようなURLで表示させています。client_idは念のため伏せます。チャンネルIDを指定しています。 https://access.line.me/oauth2/v2.1/authorize?client_id=****&redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback&response_type=code&scope=profile+openid&state=79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e これでログイン画面は問題なく表示され「ログイン」ボタンを押すと、下記のURLに戻ってきます。これは私のローカルのWEBアプリです。 https://dd7c0812.ngrok.io/users/auth/line/callback?code=ZdpeKTHQMr3FLBCKnImK&state=79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e ここでhttps://api.line.me/oauth2/v2.1/tokenにポストすると{“error”:”invalid_grant”,”error_description”:”redirect_uri does not match”}のレスポンスが帰ってきてトークンの取得が出来ません。 ポスト内容はこんな感じです(同じくシークレットはふせます)。 https://api.line.me/oauth2/v2.1/token Content-Type: application/x-www-form-urlencoded client_id=*** client_secret=*** code=ZdpeKTHQMr3FLBCKnImK grant_type=authorization_code redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback%3Fcode%3DZdpeKTHQMr3FLBCKnImK%26state%3D79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e 実際にはomniauth-lineが全部組み立ててるのでミスは無いと思うのですが失敗してしまうので、何か管理画面側の設定かなと思っています。関係あるか分からないけど試したのは、チャンネルを公開にしてみたのと、ログインを試してるLINEアカウントをチェンネルの権限設定でTesterに登録しました。 LINEのサポートにも問い合わせましたが、散々またされたあげくに、 大変申し訳ございませんが、ドキュメント内設定などの技術的なサポートは個別返信を行っておりません。 不明点などは、LINE Developers ページ内の「FAQ」や「Community」をご参照ください。 とのつれない返事が・・・コミュニティーも見たけどそれっぽい物は有りません。何か思い当たることがある方いらっしゃいますでしょうか? 2019/12/24追記 いただいた回答でファイナルアンサーなのですが、その後ライブラリの中身を追って、何故この問題が起きたのか、どう解決すれば良いのかまとめましたので同じ問題ではまってる人いたら参考にしてください。 https://qiita.com/MasamotoMiyata/items/ccc932e96a4f5dd6c2e1 解決 トークンエンドポイント(https://api.line.me/oauth2/v2.1/token)に送信しているリクエストのredirect_uriが正しくない(不要なcodeとstateパラメーターを付加している)ことが原因です。 エラーは、 “redirect_uri does not match” なので、トークンリクエストのクエリーストリングで指定したredirect_uri(リダイレクトURI:ユーザーがログインした後のリダイレクト先)が、LINE(=OAuth 2.0の認可サーバー)の管理コンソールで設定したものと完全に一致していないはずです。 [参考] LINE Developers ドキュメント https://developers.line.biz/ja/docs/line-login/web/integrate-line-login/ 最初に認可エンドポイント(https://access.line.me/oauth2/v2.1/authorize)にリクエストを送信したときは、以下のように正常なURI(=LINE側に登録されている「Callback URL」と一致しているURL)なので成功しますが、 redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback 次にトークンエンドポイント(https://api.line.me/oauth2/v2.1/token)にリクエストを送信したときは、以下のように不正なURL(一致しないURL)なので失敗します。 redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback%3Fcode%3DZdpeKTHQMr3FLBCKnImK%26state%3D79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e このURLは、URLデコードすると分かりますが、最初のリクエストで指定したURLにLINEで発行された認可コード(code)とstateパラメーターが付加されているので、これを含めないでPOSTする必要があります。 ?code=ZdpeKTHQMr3FLBCKnImK&state=79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e…(Continue Reading)

deviseのログイン時に、ユーザ名、メールアドレス、パスワードでログインしたい

投稿者: Anonymous 現在Railsアプリを作成の中で、Devise Gemを使用しています。 デフォルトではログイン時に、メールアドレスとパスワードでログイン出来るかと思います。 そこにユーザ名も追加したいと思い、調べていると大体の記事が、 ユーザ名とパスワード又はメールアドレスとパスワードのログイン方法についてしか説明されていませんでした。 出来ればユーザ名とメールアドレスとパスワードの3つでログイン機能を実装したいと考えています。 何かご教授頂ければ幸いです。 [実行した事] config/initializers/devise.rb に config.authentication_keys = [:username]を追加すれば、 ユーザ名とパスワードでログインできたので、 config.authentication_keys = [:email]も追加したら、 メールアドレスとパスワードだけでログイン出来てしまう。 [app/controllers/application_controller.rb] class ApplicationController < ActionController::Base protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters added_attrs = [:email, :username, :password, :password_confirmation] devise_parameter_sanitizer.permit :sign_up, keys: added_attrs devise_parameter_sanitizer.permit :account_update, keys: added_attrs devise_parameter_sanitizer.permit :sign_in, keys: added_attrs end end…(Continue Reading)

deviseを実装。モデルとコントローラーにコードを書き、update時にpasswordのバリデーションを解除したい。

投稿者: Anonymous プロフィールページのデザインを改善したので、 プロフィールを入力して、出来を確認しようと考えたのですが、 deviseのvalidationで躓いてしまいました( ;∀;) 前提・実現したいこと プロフィール更新時のパスワードvalidationを解除したい。 deviseを実装しています。 発生している問題・エラーメッセージ 自分なりにdeviseにおけるパスワード解除を実装したつもりなのですが、 プロフィールを更新すると Password can’t be blank と、拒絶されてしまいます。 このようなエラーも発生していました。 DEPRECATION WARNING: You attempted to assign a value which is not explicitly `true` or `false` (“{:autofocus=>true}”) to a boolean column. Currently this value casts to `false`. This will change to match Ruby’s semantics, and will cast to…(Continue Reading)