ben

OMÜ , Bilgisayar Mühendisliği, 13'

17 Eylül 2015 Perşembe

rails-doorkeeper-provider

     Daha önceki twitter-facebook ve omniouth kodlamalarımızda provider taraf twitter-facebook-google siteleriydi. Diyelimki kendi yaptımız bir sitenin login sistemini başka bir sistemde kullanmak istersek , bizim sitemizi provider olarak hazırlayıp, her bir ugulama için ıd ve key almamız gerekir. minimum gereksinim devise!, Giriş cıkış sistemi olan(devise)  rails uygulaması üzerinden devam edeceğiz.

 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