diff --git a/Gemfile b/Gemfile index 00c79238..e7bff0e5 100644 --- a/Gemfile +++ b/Gemfile @@ -47,5 +47,5 @@ end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] +gem 'omniauth' gem 'bigbluebutton-api-ruby' - diff --git a/Gemfile.lock b/Gemfile.lock index 3aa0a317..1f53b57b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -57,6 +57,7 @@ GEM ffi (1.9.14) globalid (0.3.7) activesupport (>= 4.1.0) + hashie (3.4.6) i18n (0.7.0) jbuilder (2.6.0) activesupport (>= 3.0.0, < 5.1) @@ -82,6 +83,9 @@ GEM nio4r (1.2.1) nokogiri (1.6.8.1) mini_portile2 (~> 2.1.0) + omniauth (1.3.1) + hashie (>= 1.2, < 4) + rack (>= 1.0, < 3) puma (3.6.0) rack (2.0.1) rack-test (0.6.3) @@ -163,6 +167,7 @@ DEPENDENCIES jbuilder (~> 2.5) jquery-rails listen (~> 3.0.5) + omniauth puma (~> 3.0) rails (~> 5.0.0, >= 5.0.0.1) sass-rails (~> 5.0) @@ -175,4 +180,4 @@ DEPENDENCIES web-console BUNDLED WITH - 1.13.2 + 1.13.4 diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c07694e..5e1257af 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,8 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + + def current_user + @current_user ||= User.find_by(id: session[:user_id]) + end + helper_method :current_user end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 00000000..e2ab24aa --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,17 @@ +class SessionsController < ApplicationController + def create + @user = User.from_omniauth(request.env['omniauth.auth']) + session[:user_id] = @user.id + rescue => e + logger.error "Error authenticating via omniauth: #{e}" + ensure + redirect_to root_path + end + + def destroy + if current_user + session.delete(:user_id) + end + redirect_to root_path + end +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 00000000..80c35a02 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,9 @@ +class User < ApplicationRecord + + def self.from_omniauth(auth_hash) + user = find_or_create_by(uid: auth_hash['uid'], provider: auth_hash['provider']) + user.name = auth_hash['info']['name'] + user.save! + user + end +end diff --git a/config/routes.rb b/config/routes.rb index 57c3044e..e7d2d4e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Rails.application.routes.draw do get 'meeting(/:id)', to: 'landing#index' + get '/auth/:provider/callback', to: 'sessions#create' + get '/logout', to: 'sessions#destroy' root to: 'landing#index' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html diff --git a/db/migrate/20161017160526_create_users.rb b/db/migrate/20161017160526_create_users.rb new file mode 100644 index 00000000..c795a6ee --- /dev/null +++ b/db/migrate/20161017160526_create_users.rb @@ -0,0 +1,15 @@ +class CreateUsers < ActiveRecord::Migration[5.0] + def change + create_table :users do |t| + t.string :provider, null: false + t.string :uid, null: false + t.string :name + + t.timestamps + end + + add_index :users, :provider + add_index :users, :uid + add_index :users, [:provider, :uid], unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 00000000..1834e3e8 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,26 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20161017160526) do + + create_table "users", force: :cascade do |t| + t.string "provider", null: false + t.string "uid", null: false + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["provider", "uid"], name: "index_users_on_provider_and_uid", unique: true + t.index ["provider"], name: "index_users_on_provider" + t.index ["uid"], name: "index_users_on_uid" + end + +end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 00000000..2f72a665 --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + provider: MyString + uid: MyString + name: MyString + +two: + provider: MyString + uid: MyString + name: MyString diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 00000000..82f61e01 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UserTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end