Commit 9e366b4
Changed files (8)
app
controllers
scim
views
scim
v2
users
config
spec
requests
scim
app/controllers/scim/v2/users_controller.rb
@@ -0,0 +1,24 @@
+module Scim
+ module V2
+ class UsersController < ApplicationController
+ def create
+ @user = User.create!(
+ email: user_params[:userName],
+ password: SecureRandom.hex(32),
+ )
+ response.headers['Content-Type'] = 'application/scim+json'
+ response.headers['Location'] = scim_v2_users_url(@user)
+ render status: :created
+ end
+
+ private
+
+ def authenticate!
+ end
+
+ def user_params
+ params.permit(:schemas, :userName)
+ end
+ end
+ end
+end
app/views/scim/v2/users/create.jbuilder
@@ -0,0 +1,10 @@
+json.schemas [Scim::Shady::Schemas::USER]
+json.id @user.id
+json.userName @user.email
+json.meta do
+ json.resourceType "User"
+ json.created @user.created_at.iso8601
+ json.lastModified @user.updated_at.iso8601
+ json.location scim_v2_users_url(@user)
+ json.version @user.lock_version
+end
config/routes.rb
@@ -6,5 +6,11 @@ Rails.application.routes.draw do
resource :metadata, only: [:show]
resource :dashboard, only: [:show]
resources :registrations, only: [:new, :create]
+
+ namespace :scim do
+ namespace :v2, defaults: { format: 'json' } do
+ resources :users, only: [:create]
+ end
+ end
root to: "sessions#new"
end
db/migrate/20180113222024_add_lock_version_to_users.rb
@@ -0,0 +1,5 @@
+class AddLockVersionToUsers < ActiveRecord::Migration[5.1]
+ def change
+ add_column :users, :lock_version, :bigint, default: 0, null: false
+ end
+end
db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20171111230910) do
+ActiveRecord::Schema.define(version: 20180113222024) do
create_table "sessions", force: :cascade do |t|
t.string "session_id", null: false
@@ -27,6 +27,7 @@ ActiveRecord::Schema.define(version: 20171111230910) do
t.string "password_digest"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.bigint "lock_version", default: 0, null: false
t.index ["uuid"], name: "index_users_on_uuid"
end
spec/requests/scim/v2/users_spec.rb
@@ -0,0 +1,36 @@
+require 'rails_helper'
+
+describe '/scim/v2/users' do
+ describe "POST /scim/v2/users" do
+ let(:token) { SecureRandom.uuid }
+ let(:email) { FFaker::Internet.email }
+ let(:headers) do
+ {
+ 'Authorization' => "Bearer #{token}",
+ 'Accept' => 'application/json',
+ 'Content-Type' => 'application/json',
+ }
+ end
+
+ it 'creates a new user' do
+ body = { schemas: [Scim::Shady::Schemas::USER], userName: email }
+
+ post '/scim/v2/users', params: body.to_json, headers: headers
+
+ expect(response).to have_http_status(:created)
+ expect(response.headers['Content-Type']).to eql('application/scim+json')
+ expect(response.headers['Location']).to be_present
+ expect(response.body).to be_present
+
+ json = JSON.parse(response.body, symbolize_names: true)
+ expect(json[:schemas]).to match_array([Scim::Shady::Schemas::USER])
+ expect(json[:id]).to be_present
+ expect(json[:userName]).to eql(email)
+ expect(json[:meta][:resourceType]).to eql('User')
+ expect(json[:meta][:created]).to be_present
+ expect(json[:meta][:lastModified]).to be_present
+ expect(json[:meta][:location]).to be_present
+ expect(json[:meta][:version]).to be_present
+ end
+ end
+end
Gemfile
@@ -67,3 +67,4 @@ gem 'rails-assets-bootstrap', source: 'https://rails-assets.org'
gem 'jwt'
gem 'activerecord-session_store'
gem "email_validator"
+gem 'scim-shady', path: '../scim-shady'
Gemfile.lock
@@ -1,3 +1,8 @@
+PATH
+ remote: ../scim-shady
+ specs:
+ scim-shady (0.1.0)
+
GEM
remote: https://rubygems.org/
remote: https://rails-assets.org/
@@ -271,6 +276,7 @@ DEPENDENCIES
rspec-rails (~> 3.6)
saml-kit (= 0.3.2)
sass-rails (~> 5.0)
+ scim-shady!
selenium-webdriver
spring
spring-watcher-listen (~> 2.0.0)
@@ -283,4 +289,4 @@ DEPENDENCIES
webmock
BUNDLED WITH
- 1.16.0
+ 1.16.1