복붙노트

[RUBY-ON-RAILS] 레일의 고유 한 토큰을 만들 수있는 가장 좋은 방법은?

RUBY-ON-RAILS

레일의 고유 한 토큰을 만들 수있는 가장 좋은 방법은?

여기에 내가 사용하고거야. 토큰은 반드시이 무엇보다도 짧은 URL 식별자처럼, 추측들을 수없는, 나는 짧은 그것을 유지하려는. 나는 온라인 내가 찾은 몇 가지 예를 따랐다 및 충돌의 경우에, 나는 아래 코드는 토큰을 다시 생각,하지만 난 진짜 모르겠어요. 이 가장자리 주위에 약간 거친 느낌으로 나는, 그러나, 더 나은 제안을 궁금 해요.

def self.create_token
    random_number = SecureRandom.hex(3)
    "1X#{random_number}"

    while Tracker.find_by_token("1X#{random_number}") != nil
      random_number = SecureRandom.hex(3)
      "1X#{random_number}"
    end
    "1X#{random_number}"
  end

토큰에 대한 나의 데이터베이스 컬럼은 고유 인덱스이며, 또한 validates_uniqueness_of 사용하고 있습니다 : 모델에 토큰을하지만, 이러한 자동으로 응용 프로그램에서 사용자의 행동에 따라 일괄 적으로 만들어지기 때문에 (그들은 주문을하고 본질적으로 토큰을 구입 ),이 앱이 오류가 발생 가지고 가능하지 않습니다.

내가, 내 생각도 할 수 충돌의 가능성, APPEND 끝에 다른 문자열을 줄이기 위해 뭔가는 시간이나 그런 일을 기준으로 생성,하지만 난 토큰이 너무 오래하고 싶지 않습니다.

해결법

  1. ==============================

    1.- 업데이트 -

    - 업데이트 -

    1 월 9로, 2015 년 솔루션은 현재 레일 (5) 액티브의 보안 토큰 구현에서 구현됩니다.

    - 4 3 레일 -

    다만 향후 기준, 안전 임의 토큰을 생성하고 (루비 1.9 및 액티브를 사용하는 경우) 모델에 대한 그것의 고유성을 보장 :

    class ModelName < ActiveRecord::Base
    
      before_create :generate_token
    
      protected
    
      def generate_token
        self.token = loop do
          random_token = SecureRandom.urlsafe_base64(nil, false)
          break random_token unless ModelName.exists?(token: random_token)
        end
      end
    
    end
    

    편집하다:

    시작 대체 제안 @kain, 나는 동의 ... end..while을 루프 할 ... 이전 구현이 미래에서 제거 얻을 수 있기 때문에하지 않는 ...이 답변에 끝 휴식.

    편집 2 :

    레일 4와 관심으로, 나는 관심이 이동 추천 할 것입니다.

    # app/models/model_name.rb
    class ModelName < ActiveRecord::Base
      include Tokenable
    end
    
    # app/models/concerns/tokenable.rb
    module Tokenable
      extend ActiveSupport::Concern
    
      included do
        before_create :generate_token
      end
    
      protected
    
      def generate_token
        self.token = loop do
          random_token = SecureRandom.urlsafe_base64(nil, false)
          break random_token unless self.class.exists?(token: random_token)
        end
      end
    end
    
  2. ==============================

    2.라이언 베이츠는 베타 초대장에 그의 Railscast 코드의 좋은 조금을 사용합니다. 이것은 40 영숫자 문자열을 생성합니다.

    라이언 베이츠는 베타 초대장에 그의 Railscast 코드의 좋은 조금을 사용합니다. 이것은 40 영숫자 문자열을 생성합니다.

    Digest::SHA1.hexdigest([Time.now, rand].join)
    
  3. ==============================

    3.이 늦은 응답 할 수 있지만 루프를 사용 방지하기 위해 당신은 또한 재귀 메서드를 호출 할 수 있습니다. 그것은 외모와 나에게 약간 청소기 느낀다.

    이 늦은 응답 할 수 있지만 루프를 사용 방지하기 위해 당신은 또한 재귀 메서드를 호출 할 수 있습니다. 그것은 외모와 나에게 약간 청소기 느낀다.

    class ModelName < ActiveRecord::Base
    
      before_create :generate_token
    
      protected
    
      def generate_token
        self.token = SecureRandom.urlsafe_base64
        generate_token if ModelName.exists?(token: self.token)
      end
    
    end
    
  4. ==============================

    4.이 문서에서 설명이 일을 꽤 매끄러운의 방법이 있습니다 :

    이 문서에서 설명이 일을 꽤 매끄러운의 방법이 있습니다 :

    https://web.archive.org/web/20121026000606/http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby

    나와 나의 마음에 드는 이것이다 :

    rand(36**8).to_s(36)
    => "uur0cj2h"
    
  5. ==============================

    5.당신은 고유 무언가를 원하는 경우에이 같은 것을 사용할 수 있습니다 :

    당신은 고유 무언가를 원하는 경우에이 같은 것을 사용할 수 있습니다 :

    string = (Digest::MD5.hexdigest "#{ActiveSupport::SecureRandom.hex(10)}-#{DateTime.now.to_s}")
    

    그러나이 32 개 문자의 문자열을 생성합니다.

    그러나 다른 방법이 있습니다 :

    require 'base64'
    
    def after_create
    update_attributes!(:token => Base64::encode64(id.to_s))
    end
    

    10000와 같은 ID에 대한 예를 들어, 생성 된 토큰은 "MTAwMDA ="(그리고 당신은 쉽게가 id를 디코딩 할 수 있습니다, 단지 메이크업 같은 것

    Base64::decode64(string)
    
  6. ==============================

    6.이 도움이 될 수 있습니다 :

    이 도움이 될 수 있습니다 :

    SecureRandom.base64(15).tr('+/=', '0aZ')
    

    당신이 두 번째 인수 '0aZ'와 15 '+ / ='및 문자 넣어 첫 번째 인수에 넣어보다 특수 문자를 제거하려면 여기에 길이입니다.

    그리고 당신은 여분의 공간과 일을 같이 추가보다 새로운 라인 문자를 제거하려면 :

    SecureRandom.base64(15).tr('+/=', '0aZ').strip.delete("\n")
    

    사람이 의지의 도움을 바랍니다.

  7. ==============================

    7.이 방법을 시도해보십시오

    이 방법을 시도해보십시오

    루비 1.9로, UUID 생성이 내장되어있다. SecureRandom.uuid 기능을 사용합니다. 루비에서 생성 된 GUID

    이것은 나를 위해 도움이되었다

  8. ==============================

    8.당신이 할 수있는 사용자 has_secure_token https://github.com/robertomiranda/has_secure_token

    당신이 할 수있는 사용자 has_secure_token https://github.com/robertomiranda/has_secure_token

    사용하기 정말 간단합니다

    class User
      has_secure_token :token1, :token2
    end
    
    user = User.create
    user.token1 => "44539a6a59835a4ee9d7b112b48cd76e"
    user.token2 => "226dd46af6be78953bde1641622497a8"
    
  9. ==============================

    9.적절한, MySQL은, VARCHAR (32) GUID를 만들려면

    적절한, MySQL은, VARCHAR (32) GUID를 만들려면

    SecureRandom.uuid.gsub('-','').upcase
    
  10. ==============================

    10.

    def generate_token
        self.token = Digest::SHA1.hexdigest("--#{ BCrypt::Engine.generate_salt }--")
    end
    
  11. ==============================

    11.나는 토큰 그냥 비밀번호와 같은 처리한다고 생각합니다. 따라서, 그들은 DB 암호화해야한다.

    나는 토큰 그냥 비밀번호와 같은 처리한다고 생각합니다. 따라서, 그들은 DB 암호화해야한다.

    모델에 대한 고유 한 새 토큰을 생성하기 위해이 같은 일을 I'n :

    key = ActiveSupport::KeyGenerator
                    .new(Devise.secret_key)
                    .generate_key("put some random or the name of the key")
    
    loop do
      raw = SecureRandom.urlsafe_base64(nil, false)
      enc = OpenSSL::HMAC.hexdigest('SHA256', key, raw)
    
      break [raw, enc] unless Model.exist?(token: enc)
    end
    
  12. from https://stackoverflow.com/questions/6021372/best-way-to-create-unique-token-in-rails by cc-by-sa and MIT license