[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 월 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.라이언 베이츠는 베타 초대장에 그의 Railscast 코드의 좋은 조금을 사용합니다. 이것은 40 영숫자 문자열을 생성합니다.
라이언 베이츠는 베타 초대장에 그의 Railscast 코드의 좋은 조금을 사용합니다. 이것은 40 영숫자 문자열을 생성합니다.
Digest::SHA1.hexdigest([Time.now, rand].join)
-
==============================
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.이 문서에서 설명이 일을 꽤 매끄러운의 방법이 있습니다 :
이 문서에서 설명이 일을 꽤 매끄러운의 방법이 있습니다 :
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.당신은 고유 무언가를 원하는 경우에이 같은 것을 사용할 수 있습니다 :
당신은 고유 무언가를 원하는 경우에이 같은 것을 사용할 수 있습니다 :
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.이 도움이 될 수 있습니다 :
이 도움이 될 수 있습니다 :
SecureRandom.base64(15).tr('+/=', '0aZ')
당신이 두 번째 인수 '0aZ'와 15 '+ / ='및 문자 넣어 첫 번째 인수에 넣어보다 특수 문자를 제거하려면 여기에 길이입니다.
그리고 당신은 여분의 공간과 일을 같이 추가보다 새로운 라인 문자를 제거하려면 :
SecureRandom.base64(15).tr('+/=', '0aZ').strip.delete("\n")
사람이 의지의 도움을 바랍니다.
-
==============================
7.이 방법을 시도해보십시오
이 방법을 시도해보십시오
루비 1.9로, UUID 생성이 내장되어있다. SecureRandom.uuid 기능을 사용합니다. 루비에서 생성 된 GUID
이것은 나를 위해 도움이되었다
-
==============================
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.적절한, MySQL은, VARCHAR (32) GUID를 만들려면
적절한, MySQL은, VARCHAR (32) GUID를 만들려면
SecureRandom.uuid.gsub('-','').upcase
-
==============================
10.
def generate_token self.token = Digest::SHA1.hexdigest("--#{ BCrypt::Engine.generate_salt }--") end
-
==============================
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
from https://stackoverflow.com/questions/6021372/best-way-to-create-unique-token-in-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 무엇 도우미 수행하고 helper_method은 무엇입니까? (0) | 2020.02.06 |
---|---|
[RUBY-ON-RAILS] 어떻게 Gemfile에 로컬 보석을 지정할 수 있습니다? (0) | 2020.02.06 |
[RUBY-ON-RAILS] 사회 활동 스트림을 구현하는 가장 좋은 방법은 무엇입니까? [닫은] (0) | 2020.02.06 |
[RUBY-ON-RAILS] 루비 블록 구문 오류 [중복] (0) | 2020.02.06 |
[RUBY-ON-RAILS] 새로운 데이터는 포스트 그레스에 레일 배열 열을 지속하지 (0) | 2020.02.06 |