2017-09-21 21 views
0

私は基本的な設定で/follow_up_form/purchase.idへのリンクを送っているので、購入のためにいくつかの情報を編集できるように顧客に電子メールを送りたいと思います。Railsでフォローアップフォームを非公開にするにはどうすればよいですか?

私たちは、そのURLを入力してユーザーの情報を変更するだけで、購入に必要なログイン情報はありませんので、明らかに機能しません。

秘密のURLを自動生成する方法や、ある種の認証トークンを渡す方法はありますか?これはシンプルにすべきだと感じていますが、良いアイディアはありません。

ありがとうございます!

答えて

0

rails 5 has_secure_tokenを使用して、/follow_up_form/purchase.id?tok='some_toke 'のようなパラメータとしてURLに埋め込むことができます。また、編集用のフォームを返す際にこのパラメータをチェックしてください。これは確かに物事をより安全にします。

+0

私はRails 4を使用していますが、私はBCrypt Gemと同様のことを達成しました。 – michael

+1

BCryptは完全に過剰です。これは、比較的高い計算コストでパスワードを暗号化するためのものです。 Ruby stdlib [SecureRandom](https://ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html)を使用してください。 'has_secure_token'は' SecureRandom.base58(24) 'を使います。衝突の可能性はほとんどありません。 – max

0

は、私が購入にtoken列を追加し、作成後にそれを設定します:

require 'secure_random' 
class Purchase < ActiveRecord::Base 
    before_create :regenerate_token 

    def regenerate_token 
    self.token = SecureRandom.urlsafe_base64(24) 
    end 
end 

することはできその後、あなたのようなセットアップフォローアップする任意の他のネストされたリソース:

resources :purchases do 
    resources :follow_ups, only: [:new, :create] 
end 

へユーザーがフィードバックを使用するフォームへのリンクを作成します。

<%= link_to("Tell us what you think", new_purchase_follow_up_url(@purchase, token: @purchase.token)) %> 

これは、アクセストークンを含むURLにクエリ文字列パラメータを追加します。アクセストークンは、我々は購入のために保存されたものと一致した場合、我々はチェックし、コントローラに認証するために :

class FollowUpsController < ApplicationConrtroller 
    before_action :set_purchase! 
    before_action :check_token! 

    # ... 

    private 
    def set_purchase! 
     @purchase = Purchase.find(params[:purchase_id]) 
    end 

    def check_token! 
     unless params[:access_token] == @purchase.token 
     redirect_to root_path, error: 'You are not authorized' and return false 
     end 
    end 
end 

を新しいの間でトークンを渡すとアクションを作成するには、隠し入力としてフォームに追加します。

<%= form_for(@follow_up) do |f| %> 
    <%= hidden_field_tag :access_token, @purchase.token %> 
<% end %> 
+0

これは[has_secure_token](http://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html)のまっすぐなバックポートですが、私が 'urlsafe_base64'を使ってトークンがインクルードするのに適しているクエリ文字列 – max

関連する問題