Ruby

Authenticate requests and manage Passage users with Ruby.

To use the Passage Ruby SDK, you'll need your Passage App ID. You can create a new Passage App in the console.

To see a full example Rails application using the Ruby SDK, check out this Github repo.

The Ruby SDK can be installed from the command line: gem install passageidentity

Authenticating a Request

A Ruby on Rails server can easily authenticate an HTTP request using the passageidentity gem, available via RubyGems. The example below shows a Rails application that uses Passage to authorize requests.

require 'passageidentity'

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception

    Passage = Passage::Client.new(
      app_id: Rails.application.config.passage_app_id
    )

    def authorize!
      begin
        request.to_hash()
        @user_id = Passage.auth.authenticate_request(request)
        session[:psg_user_id] = @user_id
      rescue Exception => e
        # unauthorized
        redirect_to "/unauthorized"
      end
    end
  end           

Then routes are protected using a before_action.

class DashboardController < ApplicationController

  before_action :authorize!, except: %i[unauthorized]

  def authorized
    @user = session[:psg_user_id]
  end

  def unauthorized
  end
end

By default, Passage looks for the user JWT from a cookie that is set by the Passage Element ( psg_auth_token ). If your application uses Authorization headers instead, you can pass the following option to Passage.

psg = Passage::Client.new(
    app_id: PASSAGE_APP_ID, 
    auth_strategy: Passage::HEADER_STRATEGY
)

Note: If you are not building with Rails, you should use the authenticate_jwt method and extract the JWT from the header yourself in the authorize function.

Authorizing a User

It is important to remember that Passage.auth.authenticate_request(request) validates that a request is properly authenticated, but an additional authorization check is often required. You should use the Passage User ID to store role information and make authorization decisions.


  before_action :authorize!, except: %i[unauthorized]

  def authorized
    @user = session[:psg_user_id]
    authorized = authorizationCheck(@user)
    if authorized
    # Successful authentication and authorization. Proceed ...

App Information

The Passage SDK provides a way to retrieve information about an app.

require 'passageidentity'

PassageClient = Passage::Client.new(
    app_id: PASSAGE_APP_ID,
)

passageAppInfo = PassageClient.get_app()

puts passageAppInfo

User Management

In addition to authenticating requests, the Passage SDK also provides a way to securely manage your users. These functions require authentication using a Passage API key. API keys can be managed in the Passage Console.

Passage API Keys are sensitive! You should store them securely along with your other application secrets.

The functionality currently available on a user is:

  • Get a user's information (including any defined user metadata fields)

  • Activate or deactivate a user (a deactivated user will not be able to log in)

  • Update a user's information (email address or phone number)

  • Delete a user

  • Create a user

PassageClient = Passage::Client.new(
    app_id: PASSAGE_APP_ID, 
    api_key: PASSAGE_API_KEY
)
user = PassageClient.user.get(user_id: @user_id)

All fields available in a Passage User object are listed below:

Field

Type

id

string

email

string

phone

string

active

boolean

email_verified

boolean

created_at

datetime

last_login_at

datetime

webauthn

boolean

user_metadata

map

webauthn_devices

array of strings (e.g. "Mac OS X")

recent_events

array of PassageEvents

User Device Management

The functionality currently available is:

  • List all devices for a user

  • Revoke a particular device from a user

require 'passageidentity'

PassageClient = Passage::Client.new(
    app_id: PASSAGE_APP_ID, 
    api_key: PASSAGE_API_KEY
)
    
devices = PassageClient.user.list_devices(user_id: user_id)

The Ruby SDK can be used to generate custom magic links for users, that can be embedded into any content medium. To learn more, see our full guide on Embedded Magic Links.

require 'passageidentity'

PassageClient = Passage::Client.new(
    app_id: PASSAGE_APP_ID, 
    api_key: PASSAGE_API_KEY
)
    
magic_link = PassageClient.create_magic_link(user_id: user_id)
magic_link = PassageClient.create_magic_link(
    email: "[email protected]", 
    send: true, 
    channel: Passage::EMAIL_CHANNEL, 
    ttl: 120
)

Last updated

Change request #337: react native