Omniauth::PracticeFusion

OAuth 2 strategy for Practice Fusion. Redundant description :\

Installation

Add this line to your application's Gemfile:

source 'http://gems.hq.practicefusion.com'
gem 'omniauth-practicefusion' 

And then execute:

$ bundle

Usage

This works with Devise and Omniauth. Get an App ID and Secret from Ken. Give him your callback URL (/users/auth/practicefusion/callback).

Configuration

Rails.application.config.middleware.use OmniAuth::Builder do
  provider OmniAuth::Strategies::PracticeFusion, ENV['PF_OAUTH_CLIENT_ID'], ENV['PF_OAUTH_CLIENT_SECRET'], {
      scope: ENV['PF_OAUTH_SCOPE'],
      path_prefix: '/providers/auth',
      client_options: {
        site: ENV['PF_OAUTH_SITE_URL'],
      }
  }
end

Sample Hash

{
       "provider" => "practicefusion",
            "uid" => "3cbbbd62-159d-4c40-be4c-2cdf784d6c7d",
           "info" => {
                "title" => "Dr",
           "first_name" => "Sam",
            "last_name" => "Withnoname",
        "practice_guid" => "9571286c-c379-4053-9fa3-04caeb62fb69",
                "email" => "[email protected]"
    },
    "credentials" => {
                "token" => "3hvHj7PyVFH9TGyDFXaq",
        "refresh_token" => "VqycQpxuBS5tjP_Kaab-",
           "expires_at" => 1412279343,
              "expires" => true
    },
          "extra" => {
        "raw_info" => {
                        "title" => "Dr",
                    "firstName" => "Sam",
                     "lastName" => "Withnoname",
                 "practiceGuid" => "9571286c-c379-4053-9fa3-04caeb62fb69",
                  "ehrUserGuid" => "3cbbbd62-159d-4c40-be4c-2cdf784d6c7d",
            "loginEmailAddress" => "[email protected]"
        }
    }
}

Devise

First define your application id and secret in "config/initializers/devise.rb" your scope maybe different. TODO add all available scopes.

config.omniauth :practicefusion, ENV['PF_APP_ID'], ENV['PF_APP_SECRET'], {
                                                                                      scope: 'user:r_basic',
                                                                                      response_type: 'code'
                                                                                  }

Then add the following to 'config/routes.rb' so the callback routes are defined.

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }

f Devise default callback URL is '/users/auth/practicefusion/callback' with the above route.

Make sure your model is omniauthable. Generally this is "/app/models/user.rb"

devise :omniauthable, :omniauth_providers => [:practicefusion]

Then make sure your callbacks controller is setup.

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def practicefusion
        @user = User.find_for_practicefusion(request.env['omniauth.auth'], current_user)

        if @user.persisted?
           @user, event: :authentication
        else
          redirect_to new_user_registration_url
        end     
  end
end

and bind to or create the user

def self.find_for_practicefusion(access_token, signed_in_resource = nil)
    user = User.where(ehr_user_guid: access_token['uid']).first
      unless user
        user = User.create(name: access_token['info']['first_name'] + ' ' + access_token['info']['last_name'], ehr_user_guid: access_token['uid'], email: access_token['info']['email'], password: Devise.friendly_token[0,20])
      end
    user
end

For your views you can login using:

<%= link_to "Sign in with Practice Fusion", user_omniauth_authorize_path(:practicefusion) %>

Contributing

YES PLEASE LIKE SPECS