Commit 84abea58119bbd9a20fb93b41267aee012f5504f

Authored by Victor Costa
2 parents b84a55b8 80b76bb0

Merge branch 'oauth_rails3' into stable

app/views/account/_signup_form.html.erb
... ... @@ -16,7 +16,7 @@
16 16 <input type="hidden" id="signup_time_key" name="signup_time_key" />
17 17 <script type="text/javascript">
18 18 jQuery.ajax({
19   - type: "POST",
  19 + type: "GET",
20 20 url: "<%= url_for :controller=>'account', :action=>'signup_time' %>",
21 21 dataType: 'json',
22 22 success: function(data) {
... ...
plugins/oauth_client/Gemfile 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +gem 'omniauth'
  2 +gem 'omniauth-facebook'
  3 +gem "omniauth-google-oauth2"
... ...
plugins/oauth_client/README 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +
  2 +
  3 +https://github.com/mkdynamic/omniauth-facebook
  4 +https://github.com/zquestz/omniauth-google-oauth2
  5 +
  6 +Create Google+ application:
  7 + https://developers.google.com/+/web/signin/javascript-flow
  8 +
  9 +Create Facebook application:
  10 + https://developers.facebook.com/docs/facebook-login/v2.1
  11 + https://developers.facebook.com/docs/reference/dialogs/oauth
... ...
plugins/oauth_client/controllers/oauth_client_plugin_admin_controller.rb 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +class OauthClientPluginAdminController < AdminController
  2 +
  3 + def index
  4 + settings = params[:settings] || {}
  5 +
  6 + @settings = Noosfero::Plugin::Settings.new(environment, OauthClientPlugin, settings)
  7 + @providers = @settings.get_setting(:providers) || {}
  8 + if request.post?
  9 + @settings.save!
  10 + session[:notice] = 'Settings succefully saved.'
  11 + redirect_to :action => 'index'
  12 + end
  13 + end
  14 +
  15 +end
... ...
plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +class OauthClientPluginPublicController < PublicController
  2 +
  3 + def callback
  4 + auth = request.env["omniauth.auth"]
  5 + login = auth.info.email.split('@').first
  6 + user = environment.users.find_with_omniauth(auth)
  7 +
  8 + if user
  9 + session[:user] = user
  10 + redirect_to :controller => :account, :action => :login
  11 + else
  12 + session[:oauth_data] = auth
  13 + name = auth.info.name
  14 + name ||= auth.extra && auth.extra.raw_info ? auth.extra.raw_info.name : ''
  15 + redirect_to :controller => :account, :action => :signup, :user => {:login => login, :email => auth.info.email}, :profile_data => {:name => name}
  16 + end
  17 + end
  18 +
  19 + def failure
  20 + redirect_to root_url
  21 + end
  22 +
  23 + def destroy
  24 + session[:user] = nil
  25 + redirect_to root_url
  26 + end
  27 +
  28 +end
... ...
plugins/oauth_client/db/migrate/20140828184930_add_settings_to_users.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class AddSettingsToUsers < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :users, :settings, :string
  4 + end
  5 +
  6 + def self.down
  7 + remove_column :users, :settings
  8 + end
  9 +end
... ...
plugins/oauth_client/lib/ext/user.rb 0 → 100644
... ... @@ -0,0 +1,36 @@
  1 +require_dependency 'user'
  2 +
  3 +class User
  4 +
  5 + acts_as_having_settings :field => :settings
  6 +
  7 + settings_items :oauth_providers, :type => Array, :default => []
  8 +
  9 + def self.find_with_omniauth(auth)
  10 + user = self.find_by_email(auth.info.email)
  11 + if user && !user.oauth_providers.empty? #FIXME save new oauth providers
  12 + user
  13 + else
  14 + nil
  15 + end
  16 + end
  17 +
  18 + def password_required_with_oauth?
  19 + password_required_without_oauth? && oauth_providers.blank?
  20 + end
  21 +
  22 + alias_method_chain :password_required?, :oauth
  23 +
  24 + after_create :activate_oauth_user
  25 +
  26 + def activate_oauth_user
  27 + activate unless oauth_providers.empty?
  28 + end
  29 +
  30 + def make_activation_code_with_oauth
  31 + oauth_providers.blank? ? make_activation_code_without_oauth : nil
  32 + end
  33 +
  34 + alias_method_chain :make_activation_code, :oauth
  35 +
  36 +end
... ...
plugins/oauth_client/lib/oauth_client_plugin.rb 0 → 100644
... ... @@ -0,0 +1,93 @@
  1 +require 'omniauth/strategies/noosfero_oauth2'
  2 +
  3 +class OauthClientPlugin < Noosfero::Plugin
  4 +
  5 + def self.plugin_name
  6 + "Oauth Client Plugin"
  7 + end
  8 +
  9 + def self.plugin_description
  10 + _("Login with Oauth.")
  11 + end
  12 +
  13 + def login_extra_contents
  14 + plugin = self
  15 + proc do
  16 + render :partial => 'auth/oauth_login', :locals => {:providers => plugin.enabled_providers}
  17 + end
  18 + end
  19 +
  20 + def signup_extra_contents
  21 + plugin = self
  22 +
  23 + proc do
  24 + if plugin.context.session[:oauth_data].present?
  25 + render :partial => 'account/oauth_signup'
  26 + else
  27 + ''
  28 + end
  29 + end
  30 + end
  31 +
  32 + def enabled_providers
  33 + settings = Noosfero::Plugin::Settings.new(context.environment, OauthClientPlugin)
  34 + providers = settings.get_setting(:providers)
  35 + providers.select {|provider, options| options[:enabled]}
  36 + end
  37 +
  38 + PROVIDERS = {
  39 + :facebook => {
  40 + :name => 'Facebook'
  41 + },
  42 + :google_oauth2 => {
  43 + :name => 'Google'
  44 + },
  45 + :noosfero_oauth2 => {
  46 + :name => 'Noosfero'
  47 + }
  48 + }
  49 +
  50 + def stylesheet?
  51 + true
  52 + end
  53 +
  54 + OmniAuth.config.on_failure = OauthClientPluginPublicController.action(:failure)
  55 +
  56 + Rails.application.config.middleware.use OmniAuth::Builder do
  57 + PROVIDERS.each do |provider, options|
  58 + provider provider, :setup => lambda { |env|
  59 + request = Rack::Request.new env
  60 + strategy = env['omniauth.strategy']
  61 +
  62 + domain = Domain.find_by_name(request.host)
  63 + environment = domain.environment rescue Environment.default
  64 + settings = Noosfero::Plugin::Settings.new(environment, OauthClientPlugin)
  65 + providers = settings.get_setting(:providers)
  66 +
  67 + strategy.options.client_id = providers[provider][:client_id]
  68 + strategy.options.client_secret = providers[provider][:client_secret]
  69 + }, :path_prefix => '/plugin/oauth_client', :callback_path => "/plugin/oauth_client/public/callback/#{provider}"
  70 + end
  71 +
  72 + unless Rails.env.production?
  73 + provider :developer, :path_prefix => "/plugin/oauth_client", :callback_path => "/plugin/oauth_client/public/callback/developer"
  74 + end
  75 + end
  76 +
  77 + def account_controller_filters
  78 + {
  79 + :type => 'before_filter', :method_name => 'signup',
  80 + :block => proc {
  81 + auth = session[:oauth_data]
  82 +
  83 + if auth.present? && params[:user].present?
  84 + params[:user][:oauth_providers] = [{:provider => auth.provider, :uid => auth.uid}]
  85 + if request.post? && auth.info.email != params[:user][:email]
  86 + raise "Wrong email for oauth signup"
  87 + end
  88 + end
  89 + }
  90 + }
  91 + end
  92 +
  93 +end
... ...
plugins/oauth_client/lib/omniauth/strategies/noosfero_oauth2.rb 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +require 'omniauth/strategies/oauth2'
  2 +
  3 +module OmniAuth
  4 + module Strategies
  5 + class NoosferoOauth2 < OmniAuth::Strategies::OAuth2
  6 + option :name, :noosfero_oauth2
  7 +
  8 + option :client_options, {
  9 + :site => "http://noosfero.com:3001",
  10 + :authorize_url => "/oauth/authorize"
  11 + }
  12 +
  13 + uid { raw_info["id"] }
  14 +
  15 + info do
  16 + {
  17 + :email => raw_info["email"]
  18 + # and anything else you want to return to your API consumers
  19 + }
  20 + end
  21 +
  22 + def raw_info
  23 + #@raw_info ||= access_token.get('/api/v1/me.json').parsed
  24 + #FIXME
  25 + #raise access_token.inspect
  26 + User['vfcosta'].attributes
  27 + end
  28 + end
  29 + end
  30 +end
... ...
plugins/oauth_client/public/images/facebook-icon.png 0 → 100644

831 Bytes

plugins/oauth_client/public/images/google-icon.png 0 → 100644

1.58 KB

plugins/oauth_client/public/style.css 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +.oauth-login .provider a {
  2 + min-width: 20px;
  3 + min-height: 20px;
  4 + background-size: 20px;
  5 + display: inline-block;
  6 + text-decoration: none;
  7 + background-repeat: no-repeat;
  8 + padding-left: 22px;
  9 + line-height: 20px;
  10 +}
  11 +
  12 +.oauth-login .provider .facebook {
  13 + background-image: url(images/facebook-icon.png);
  14 +}
  15 +
  16 +.oauth-login .provider .google_oauth2 {
  17 + background-image: url(images/google-icon.png);
  18 +}
  19 +
  20 +.oauth-login .provider .developer {
  21 + display: none;
  22 +}
... ...
plugins/oauth_client/test/test_helper.rb 0 → 100644
... ... @@ -0,0 +1 @@
  1 +require File.dirname(__FILE__) + '/../../../test/test_helper'
... ...
plugins/oauth_client/test/unit/oauth_client_plugin_test.rb 0 → 100644
... ... @@ -0,0 +1,86 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class OauthClientPluginTest < ActiveSupport::TestCase
  4 +
  5 + def setup
  6 + @plugin = OauthClientPlugin.new
  7 + @params = {}
  8 + @plugin.stubs(:context).returns(self)
  9 + @environment = Environment.default
  10 + end
  11 +
  12 + attr_reader :params, :plugin, :environment
  13 +
  14 + should 'has extra contents for login' do
  15 + assert plugin.login_extra_contents
  16 + end
  17 +
  18 + should 'has no signup extra contents if no provider was enabled' do
  19 + assert_equal '', instance_eval(&plugin.signup_extra_contents)
  20 + end
  21 +
  22 + should 'has signup extra contents if there is enabled providers' do
  23 + params[:user] = {:oauth_providers => [:provider]}
  24 + expects(:render).with(:partial => 'account/oauth_signup').once
  25 + instance_eval(&plugin.signup_extra_contents)
  26 + end
  27 +
  28 + should 'list enabled providers' do
  29 + settings = Noosfero::Plugin::Settings.new(environment, OauthClientPlugin)
  30 + providers = {:test => {:enabled => true}, :test2 => {:enabled => false}}
  31 + settings.set_setting(:providers, providers)
  32 + assert_equal({:test => {:enabled => true}}, plugin.enabled_providers)
  33 + end
  34 +
  35 + should 'define before filter for account controller' do
  36 + assert plugin.account_controller_filters
  37 + end
  38 +
  39 + should 'raise error if oauth email was changed' do
  40 + request = mock
  41 + stubs(:request).returns(request)
  42 + request.expects(:post?).returns(true)
  43 +
  44 + oauth_data = mock
  45 + info = mock
  46 + oauth_data.stubs(:info).returns(info)
  47 + info.stubs(:email).returns('test@example.com')
  48 + stubs(:session).returns({:oauth_data => oauth_data})
  49 +
  50 + params[:user] = {:email => 'test2@example.com'}
  51 + assert_raises RuntimeError do
  52 + instance_eval(&plugin.account_controller_filters[:block])
  53 + end
  54 + end
  55 +
  56 + should 'do not raise error if oauth email was not changed' do
  57 + request = mock
  58 + stubs(:request).returns(request)
  59 + request.expects(:post?).returns(true)
  60 +
  61 + oauth_data = mock
  62 + info = mock
  63 + oauth_data.stubs(:info).returns(info)
  64 + info.stubs(:email).returns('test@example.com')
  65 + stubs(:session).returns({:oauth_data => oauth_data})
  66 +
  67 + params[:user] = {:email => 'test@example.com'}
  68 + instance_eval(&plugin.account_controller_filters[:block])
  69 + end
  70 +
  71 + should 'do not raise error if oauth session is not set' do
  72 + request = mock
  73 + stubs(:request).returns(request)
  74 + request.expects(:post?).returns(true)
  75 + stubs(:session).returns({})
  76 + instance_eval(&plugin.account_controller_filters[:block])
  77 + end
  78 +
  79 + should 'do not raise error if it is not a post' do
  80 + request = mock
  81 + stubs(:request).returns(request)
  82 + request.expects(:post?).returns(false)
  83 + instance_eval(&plugin.account_controller_filters[:block])
  84 + end
  85 +
  86 +end
... ...
plugins/oauth_client/test/unit/user_test.rb 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class UserTest < ActiveSupport::TestCase
  4 +
  5 + should 'find with omniauth params' do
  6 + user = fast_create(User)
  7 + user.settings[:oauth_providers] = [:test => {}]
  8 + user.save!
  9 + auth = {:info => OpenStruct.new({:email => user.email})}
  10 + assert_equal user, User.find_with_omniauth(OpenStruct.new(auth))
  11 + end
  12 +
  13 + should 'do not return user if there is no provider' do
  14 + user = fast_create(User)
  15 + auth = {:info => OpenStruct.new({:email => user.email})}
  16 + assert_equal nil, User.find_with_omniauth(OpenStruct.new(auth))
  17 + end
  18 +
  19 + should 'password is not required if there is a oauth provider' do
  20 + User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [:test])
  21 + end
  22 +
  23 + should 'password is required if there is a oauth provider' do
  24 + user = User.new(:email => 'testoauth@example.com', :login => 'testoauth')
  25 + user.save
  26 + assert user.errors[:password].present?
  27 + end
  28 +
  29 + should 'activate user when created with oauth' do
  30 + user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [:test])
  31 + assert user.activated?
  32 + end
  33 +
  34 + should 'not activate user when created without oauth' do
  35 + user = fast_create(User)
  36 + assert !user.activated?
  37 + end
  38 +
  39 + should 'not make activation code when created with oauth' do
  40 + user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [:test])
  41 + assert !user.activation_code
  42 + end
  43 +
  44 + should 'make activation code when created without oauth' do
  45 + user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :password => 'test', :password_confirmation => 'test')
  46 + assert user.activation_code
  47 + end
  48 +
  49 +end
... ...
plugins/oauth_client/views/account/_oauth_signup.html.erb 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +<%= hidden_field_tag 'return_to', '/' %>
  2 +
  3 +<style>
  4 + #signup-password, #signup-password-confirmation, #signup-email {
  5 + display: none;
  6 + }
  7 +</style>
  8 +
  9 +<div id='signup-email-readonly'>
  10 + <%= labelled_form_field(_('Email'), text_field(:user, :email, :class => "disabled", :readonly => true)) %>
  11 +</div>
... ...
plugins/oauth_client/views/auth/_facebook.html.erb 0 → 100644
... ... @@ -0,0 +1 @@
  1 +<a class="facebook" href="/plugin/oauth_client/facebook"><%= _('Login with Facebook') %></a>
... ...
plugins/oauth_client/views/auth/_google_oauth2.html.erb 0 → 100644
... ... @@ -0,0 +1 @@
  1 +<a class="google_oauth2" href="/plugin/oauth_client/google_oauth2"><%= _('Login with Google') %></a>
... ...
plugins/oauth_client/views/auth/_noosfero_oauth2.html.erb 0 → 100644
... ... @@ -0,0 +1 @@
  1 +<a class="noosfero_oauth2" href="/plugin/oauth_client/noosfero_oauth2"><%= _('Login with Noosfero') %></a>
... ...
plugins/oauth_client/views/auth/_oauth_login.html.erb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<div class="oauth-login">
  2 + <% providers.each do |provider, options| %>
  3 + <span class="provider">
  4 + <%= render :partial => "auth/#{provider}", :locals => {:app_id => options['client_id'] } %>
  5 + </span>
  6 + <% end %>
  7 +
  8 + <span class="provider">
  9 + <% unless Rails.env.production? %>
  10 + <%= link_to _('Developer Login'), "/plugin/oauth/developer", :class => 'developer' %>
  11 + <% end %>
  12 + </span>
  13 +</div>
... ...
plugins/oauth_client/views/oauth_client_plugin_admin/index.html.erb 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +<h1><%= _('Oauth Client Settings') %></h1>
  2 +
  3 +<%= form_for(:settings) do |f| %>
  4 + <div class="providers">
  5 + <h3><%= _('Providers') %></h3>
  6 + <%= f.fields_for :providers, OpenStruct.new(@providers) do |p| %>
  7 +
  8 + <% OauthClientPlugin::PROVIDERS.each do |available_provider, options| %>
  9 + <% provider = OpenStruct.new(@providers[available_provider]) %>
  10 +
  11 + <%= p.fields_for available_provider, provider do |o| %>
  12 + <div class="provider">
  13 + <div class="name">
  14 + <h4><%= o.check_box :enabled, {:class => 'enable', :checked => provider.enabled=='true'}, true, false %>
  15 + <%= options[:name] %></h4>
  16 + </div>
  17 + <div class="options" style="<%= provider.enabled=='true' ? '':'display:none' %>">
  18 + <div class="client-id">
  19 + <span class="label"><%= _('Client ID') %></span>
  20 + <span class="value"><%= o.text_field :client_id %></span>
  21 + </div>
  22 + <div class="client-secret">
  23 + <span class="label"><%= _('Client Secret') %></span>
  24 + <span class="value"><%= o.text_field :client_secret %></span>
  25 + </div>
  26 + </div>
  27 + </div>
  28 + <% end %>
  29 + <% end %>
  30 + <% end %>
  31 +
  32 + <% button_bar do %>
  33 + <%= submit_button(:save, _('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
  34 + <% end %>
  35 + </div>
  36 +<% end %>
  37 +
  38 +<script>
  39 + jQuery(document).ready(function($) {
  40 + $('.providers .provider .enable').on('click', function() {
  41 + $(this).parents('.provider').find('.options').toggle('fast');
  42 + });
  43 + });
  44 +</script>
... ...
plugins/oauth_provider/Gemfile 0 → 100644
... ... @@ -0,0 +1 @@
  1 +gem 'doorkeeper'
... ...
plugins/oauth_provider/db/migrate/20140829153047_create_doorkeeper_tables.rb 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +class CreateDoorkeeperTables < ActiveRecord::Migration
  2 + def change
  3 + create_table :oauth_applications do |t|
  4 + t.string :name, null: false
  5 + t.string :uid, null: false
  6 + t.string :secret, null: false
  7 + t.text :redirect_uri, null: false
  8 + t.timestamps
  9 + end
  10 +
  11 + add_index :oauth_applications, :uid, unique: true
  12 +
  13 + create_table :oauth_access_grants do |t|
  14 + t.integer :resource_owner_id, null: false
  15 + t.integer :application_id, null: false
  16 + t.string :token, null: false
  17 + t.integer :expires_in, null: false
  18 + t.text :redirect_uri, null: false
  19 + t.datetime :created_at, null: false
  20 + t.datetime :revoked_at
  21 + t.string :scopes
  22 + end
  23 +
  24 + add_index :oauth_access_grants, :token, unique: true
  25 +
  26 + create_table :oauth_access_tokens do |t|
  27 + t.integer :resource_owner_id
  28 + t.integer :application_id
  29 + t.string :token, null: false
  30 + t.string :refresh_token
  31 + t.integer :expires_in
  32 + t.datetime :revoked_at
  33 + t.datetime :created_at, null: false
  34 + t.string :scopes
  35 + end
  36 +
  37 + add_index :oauth_access_tokens, :token, unique: true
  38 + add_index :oauth_access_tokens, :resource_owner_id
  39 + add_index :oauth_access_tokens, :refresh_token, unique: true
  40 + end
  41 +end
... ...
plugins/oauth_provider/lib/oauth_provider_plugin.rb 0 → 100644
... ... @@ -0,0 +1,111 @@
  1 +class OauthProviderPlugin < Noosfero::Plugin
  2 +
  3 + def self.plugin_name
  4 + "Oauth Provider Plugin"
  5 + end
  6 +
  7 + def self.plugin_description
  8 + _("Oauth Provider.")
  9 + end
  10 +
  11 + Doorkeeper.configure do
  12 + # Change the ORM that doorkeeper will use.
  13 + # Currently supported options are :active_record, :mongoid2, :mongoid3, :mongo_mapper
  14 + orm :active_record
  15 +
  16 + # This block will be called to check whether the resource owner is authenticated or not.
  17 + resource_owner_authenticator do
  18 + domain = Domain.find_by_name(request.host)
  19 + environment = domain ? domain.environment : Environment.default
  20 + environment.users.find_by_id(session[:user]) || redirect_to('/account/login')
  21 + end
  22 +
  23 + # If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below.
  24 + admin_authenticator do
  25 + domain = Domain.find_by_name(request.host)
  26 + environment = domain ? domain.environment : Environment.default
  27 + user = environment.users.find_by_id(session[:user])
  28 + unless user && user.person.is_admin?(environment)
  29 + redirect_to('/account/login')
  30 + end
  31 + user
  32 + end
  33 +
  34 + # Authorization Code expiration time (default 10 minutes).
  35 + # authorization_code_expires_in 10.minutes
  36 +
  37 + # Access token expiration time (default 2 hours).
  38 + # If you want to disable expiration, set this to nil.
  39 + # access_token_expires_in 2.hours
  40 +
  41 + # Reuse access token for the same resource owner within an application (disabled by default)
  42 + # Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383
  43 + # reuse_access_token
  44 +
  45 + # Issue access tokens with refresh token (disabled by default)
  46 + # use_refresh_token
  47 +
  48 + # Provide support for an owner to be assigned to each registered application (disabled by default)
  49 + # Optional parameter :confirmation => true (default false) if you want to enforce ownership of
  50 + # a registered application
  51 + # Note: you must also run the rails g doorkeeper:application_owner generator to provide the necessary support
  52 + # enable_application_owner :confirmation => false
  53 +
  54 + # Define access token scopes for your provider
  55 + # For more information go to
  56 + # https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes
  57 + # default_scopes :public
  58 + # optional_scopes :write, :update
  59 +
  60 + # Change the way client credentials are retrieved from the request object.
  61 + # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
  62 + # falls back to the `:client_id` and `:client_secret` params from the `params` object.
  63 + # Check out the wiki for more information on customization
  64 + # client_credentials :from_basic, :from_params
  65 +
  66 + # Change the way access token is authenticated from the request object.
  67 + # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
  68 + # falls back to the `:access_token` or `:bearer_token` params from the `params` object.
  69 + # Check out the wiki for more information on customization
  70 + # access_token_methods :from_bearer_authorization, :from_access_token_param, :from_bearer_param
  71 +
  72 + # Change the native redirect uri for client apps
  73 + # When clients register with the following redirect uri, they won't be redirected to any server and the authorization code will be displayed within the provider
  74 + # The value can be any string. Use nil to disable this feature. When disabled, clients must provide a valid URL
  75 + # (Similar behaviour: https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi)
  76 + #
  77 + # native_redirect_uri 'urn:ietf:wg:oauth:2.0:oob'
  78 +
  79 + # Specify what grant flows are enabled in array of Strings. The valid
  80 + # strings and the flows they enable are:
  81 + #
  82 + # "authorization_code" => Authorization Code Grant Flow
  83 + # "implicit" => Implicit Grant Flow
  84 + # "password" => Resource Owner Password Credentials Grant Flow
  85 + # "client_credentials" => Client Credentials Grant Flow
  86 + #
  87 + # If not specified, Doorkeeper enables all the four grant flows.
  88 + #
  89 + # grant_flows %w(authorization_code implicit password client_credentials)
  90 +
  91 + # Under some circumstances you might want to have applications auto-approved,
  92 + # so that the user skips the authorization step.
  93 + # For example if dealing with trusted a application.
  94 + # skip_authorization do |resource_owner, client|
  95 + # client.superapp? or resource_owner.admin?
  96 + # end
  97 +
  98 + # WWW-Authenticate Realm (default "Doorkeeper").
  99 + # realm "Doorkeeper"
  100 +
  101 + # Allow dynamic query parameters (disabled by default)
  102 + # Some applications require dynamic query parameters on their request_uri
  103 + # set to true if you want this to be allowed
  104 + # wildcard_redirect_uri false
  105 + end
  106 +
  107 + Rails.application.routes.prepend do
  108 + use_doorkeeper
  109 + end
  110 +
  111 +end
... ...