Tokens seguros do Rails 5 para o Rails 4.xe 3.x

O Rails 5 apresenta (ref rails / rails # 18217 ) um novo recurso para geração de tokens aleatórios únicos sem esforço em seus modelos, que pode ser usado para vários propósitos, como convites, registros, chaves de e-mail de redefinição de senha ou autenticação baseada em token http.

AR :: SecureToken usa SecureRandom :: base58 para gerar um token único de 24 caracteres, tenha em mente que as probabilidades de colisões são 1/58 ** 24, portanto as colisões são altamente improváveis. Ainda é possível gerar uma condição de corrida no banco de dados da mesma maneira que valida a exclusividade de lata, então, se você for extremamente paranóico, recomendamos adicionar um índice exclusivo no banco de dados.

Se você não pode esperar pelo lançamento do Rails 5, você pode começar hoje graças à gem has_secure_token . SecureRandom :: base58 também é portado de volta na gem.

Instalação

Adicione esta linha ao Gemfile do seu aplicativo:

gem 'has_secure_token'

E então execute:

$ bundle

Ou instale-o como:

$ gem install has_secure_token

Vamos dar uma olhada no código:

Configurando seu modelo

A primeira etapa é executar o gerador de migração para adicionar o campo de chave do token.

$ rails g migration AddTokenToUsers token:string
=>
invoke active_record

create db
/migrate/20150424010931_add_token_to_users.rb

Em seguida, execute rake db: migrate para atualizar a tabela de usuários no banco de dados. A próxima etapa é atualizar o código do modelo

# Schema: User(token:string, auth_token:string)
class User < ActiveRecord::Base
has_secure_token

end

user
= User.new
user
.save
user
.token # => "pX27zsMN2ViQKta1bGfLmVJE"
user
.regenerate_token # => true

Para usar uma coluna personalizada para armazenar o campo-chave do token, você pode usar a opção column_name.

# Schema: User(token:string, auth_token:string)
class User < ActiveRecord::Base
has_secure_token
:auth_token
end

user
= User.new
user
.save
user
.auth_token # => "pX27zsMN2ViQKta1bGfLmVJE"
user
.regenerate_auth_token # => true