gem: gem 'doorkeeper'
terminal:
$ rails generate doorkeeper:install
$ rails generate doorkeeper:migration
$ rake db:migrate
rootes.rb su şekilde güncellenmiş olmalı:
Rails.application.routes.draw do
use_doorkeeper
end
controller altına aşağıdaki klasor ve dosyaları oluşturalım:
api.controller.rb
module Api::V1
class ApiController < ::ApplicationController
def current_resource_owner
User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end
end
end
credentials_controller.rb
module Api::V1
class CredentialsController < ApiController
before_action :doorkeeper_authorize!
respond_to :json
def me
respond_with current_resource_owner
end
end
end
fast_controller.rb
class Api::V1::FastController < ActionController::Metal
include AbstractController::Callbacks
include ActionController::Head
include Doorkeeper::Helpers::Filter
before_action :doorkeeper_authorize!
def index
self.response_body = { :ok => true }.to_json
end
end
users_controller.rb
module Api::V1
class UsersController < ApiController
before_action :doorkeeper_authorize!
respond_to :json
def index
respond_with User.recent
end
def created
binding.pry
respond_with 'api_v1', User.create!(params[:user])
end
end
end
controllers/users_controller.rb oluturup aşağıdaki şekilde güncelliyoruz:
class UsersController < ApplicationController
def new
@user = User.new
respond_to do |format|
format.html
end
end
def create
@user = User.create!(params[:user])
sign_in_and_redirect @user
end
end
model/user.rb aşağıdaki kodları ekleyelim:
class User < ActiveRecord::Base
devise :database_authenticatable, :rememberable, :validatable
def self.blacklist_keys
@blacklist_keys ||= super - ["id"]
end
end
eğer views/devise/sessions yolunuz yoksa bu klasörleri oluşturup new.html.erb ve _form.html.erb dosyalarını aşağıdaki şekilde güncelleyelim
new.html.erb
<fieldset>
<legend>Sign in</legend>
<%= render 'form' %>
</fieldset>
_form.html.slim
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div class="clearfix">
<%= f.label :email %>
<div class="input">
<%= f.email_field :email %>
</div>
</div>
<div class="clearfix">
<%= f.label :password %>
<div class="input">
<%= f.password_field :password %>
</div>
</div>
<div class="actions">
<%= f.submit "Sign in", :class => "btn btn-primary" %><small> or <%=link_to "Sign Up", users_sign_up_path %></small>
</div>
<% end %>
initializers/doorkeper.rb
Doorkeeper.configure do
orm :active_record
resource_owner_authenticator do |routes|
current_user || warden.authenticate!(:scope => :user)
end
resource_owner_from_credentials do
warden.authenticate!(:scope => :user)
end
access_token_expires_in 5.minutes
use_refresh_token
default_scopes :public
optional_scopes :write
end
routes.rb
Rails.application.routes.draw do
use_doorkeeper
devise_for :users
namespace :api do
namespace :v1 do
resources :users
get '/me' => "credentials#me"
get '/fast' => 'fast#index'
end
end
resources :posts
root 'posts#index'
get "/users/sign_up" => "users#new"
post "/user" => "users#create"
end
altyapımız hazır programı çalıştırıp diğer programlarımız için ıd ve key alalım.
Providerda çalısan programı 4000 portunda çalıstıralım. A client programını 3000 portunda ,B clinet programını 2000 portunda çalıştıgını kugulayalım buna gorede ıd ve key üretelim
programızı rails s -p 4000 le 4000 portunda çalıştıralım
kullanıcı olusturalım:
adı:provider@gmail.com
password: 1q2w3e4r
şu linke gidelim
http://localhost:4000/oauth/applications/new
application : uygulamaA
callback url: http://localhost:3000/users/auth/doorkeeper/callback
oluştur dediğimizde ıd ve key oluşmuş olacak
B uygulaması içinde alalım:
application : uygulamaB
callback url: http://localhost:2000/users/auth/doorkeeper/callback
Provider kısmında işimiz bitti. client tarafına geçip gelen kullanıcıyı karşılayalım, burdan sonrası twitter/facebook/google ile hemen hemen aynı . ama yinede biz sıfırdan yapalım.
Buraya kadar ki olan programı burdan indirebilirsınız:
Not: Projeyi Providera alıp calıştırdığınızda redirect linkteki http:// de aşağıdaki hatayı alırsanız
Redirect URI must be an HTTPS/SSL URI
initializers/doorkeeper.rb dosyasına aşağıdaki satırı ekleyin
force_ssl_in_redirect_uri false