🛤️Rails

Examples of Integrating Sign-In with Ethereum into Rails Applications

Overview

Rails is a full-stack framework built on top of Ruby to create web apps. The following are a set of gems and examples to get you started incorporating Sign-In with Ethereum to your Rails application.

Requirements

  • Ruby version 2.7.0 or above

  • Rails - can be installed using gem install rails once Ruby is installed

  • MetaMask wallet

Two gems have been created in order to make different examples of Rails integrations possible:

siwe_rails

Which is a Rails gem that adds Sign-In with Ethereum local sign-in routes.

omniauth-siwe

Which provides an OmniAuth strategy for Sign In With Ethereum.

Examples

Currently, there are three examples of Sign-In with Ethereum being used for authentication in Rails applications:

custom-controller

Which shows how to manually add endpoints to generate and verify the Sign-In with Ethereum message, and handle session-based user logins on a Rails application.

rails-engine

Which shows how to use siwe_rails gem to set up and configure the endpoints to generate and verify a Sign-In with Ethereum message in a Rails application.

omniauth-siwe

Which shows how to use and configure the omniauth-siwe provider with OmniAuth in a Rails application.

Each of these examples can be found in the siwe-rails-examples repository.

To get started with any of the examples, clone the siwe-rails-examples repository locally:

git clone https://github.com/spruceid/siwe-rails-examples

When testing, please make sure to update the Ruby version specified in the example's Gemfile to the current version of Ruby that you are using. You can check your version of Ruby by entering ruby -v in your terminal.

To build and test each example, check out the following guides:

Custom-Controller

  • First, enter the custom-controller directory in siwe-rails-examples.

cd siwe-rails-examples/custom-controller
  • Finally, run the following commands to run the example:

bundle install
bin/rails db:migrate RAILS_ENV=development
bundle exec rails server

This executes any database migrations, installs the proper gems, and runs the Rails example. Visit the example by visiting localhost:3000 in your web browser.

You should now see the example, and be able to Sign-In with Ethereum to authenticate and establish a session.

Rails-Engine

  • Clone the siwe_rails gem in the same parent directory as siwe-rails-examples:

# from siwe-rails-examples
cd ..
git clone https://github.com/spruceid/siwe_rails
  • Next, enter the rails-engine directory in siwe-rails-examples.

cd siwe-rails-examples/rails-engine
  • Finally, run the following commands to run the example:

bundle install
bin/rails db:migrate RAILS_ENV=development
bundle exec rails server

This executes any database migrations, installs the proper gems, and runs the Rails example. Visit the example by visiting localhost:3000 in your web browser.

You should now see the example, and be able to Sign-In with Ethereum to authenticate and establish a session.

OmniAuth

  • Clone the omniauth-siwe gem in the same parent directory as siwe-rails-examples:

# from siwe-rails-examples
cd ..
git clone https://github.com/spruceid/omniauth-siwe
  • Next, enter the omniauth directory in siwe-rails-examples.

cd siwe-rails-examples/omniauth
  • To be able to use oidc.login.xyz you will need to register as a client. To do that, use the following command, filling out your own redirect_uris, according to your setup:

 curl -X POST 'https://oidc.login.xyz/register' \
  -H 'Content-type: application/json' \
  --data '{"redirect_uris": ["http://localhost:3000/auth/siwe/callback"]}'

In this case, since we're running this example on localhost:3000, we need the redirect_uris to contain http://localhost:3000/auth/siwe/callback.

  • After that, update omniauth.rb under omniauth/config/initializers with both the provided identifier (client_id) and secret (client_secret):

omniauth.rb
  client_options = {
    scheme: 'https',
    host: 'oidc.login.xyz',
    port: 443,
    authorization_endpoint: '/authorize',
    token_endpoint: '/token',
    userinfo_endpoint: '/userinfo',
    jwks_uri: '/jwk',
    identifier: 'your-client-id',
    secret: 'your-client-secret'
  }

  provider :siwe, issuer: 'https://oidc.login.xyz/', client_options: client_options
  • Finally, run the following commands to run the example:

bundle install
bundle exec rails server

This installs the proper gems and runs the Rails example. Visit the example by visiting localhost:3000 in your web browser.

You should now see the example, and be able to Sign-In with Ethereum to authenticate and establish a session.

Last updated