social_stream-oauth2_server 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/Gemfile +5 -0
- data/README.rdoc +3 -0
- data/Rakefile +26 -0
- data/app/assets/images/logos/small/site.png +0 -0
- data/app/assets/javascripts/social_stream-oauth2_server.js +6 -0
- data/app/assets/javascripts/social_stream/site_client.js +15 -0
- data/app/assets/stylesheets/social_stream-oauth2_server.css.sass +24 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/applications/_applications-oauth2server.css.sass +45 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/applications/layout/_applications-oauth2server.css.sass +51 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/applications/responsive/_responsive-1200px-min.css.sass +7 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/applications/responsive/_responsive-767px-max.css.sass +35 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/applications/responsive/_responsive-768px-979px.css.sass +8 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/create/_create-oauth2server.css.sass +11 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/create/_error_create-oauth2server.css.sass +13 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/create/layout/_create-oauth2server.css.sass +19 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/create/responsive/_responsive-1200px-min.css.sass +7 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/create/responsive/_responsive-767px-max.css.sass +16 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/create/responsive/_responsive-768px-979px.css.sass +8 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/show/_show-oauth2server.css.sass +42 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/show/layout/_show-oauth2server.css.sass +71 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/show/responsive/_responsive-1200px-min.css.sass +7 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/show/responsive/_responsive-767px-max.css.sass +16 -0
- data/app/assets/stylesheets/social_stream/oauth2_server/show/responsive/_responsive-768px-979px.css.sass +8 -0
- data/app/controllers/authorizations_controller.rb +67 -0
- data/app/controllers/site/clients_controller.rb +39 -0
- data/app/decorators/social_stream/base/actor_decorator.rb +3 -0
- data/app/decorators/social_stream/base/user_decorator.rb +3 -0
- data/app/helpers/site_client_helper.rb +17 -0
- data/app/models/oauth2_token.rb +33 -0
- data/app/models/oauth2_token/access_token.rb +32 -0
- data/app/models/oauth2_token/authorization_code.rb +5 -0
- data/app/models/oauth2_token/refresh_token.rb +7 -0
- data/app/models/relation/admin.rb +9 -0
- data/app/models/relation/auth.rb +8 -0
- data/app/models/site/client.rb +38 -0
- data/app/overrides/frontpage/_presentation/client_site_presentation.html.erb.deface +8 -0
- data/app/overrides/layouts/_header_dropdown_menu/applications_entry.html.erb.deface +4 -0
- data/app/views/authorizations/error.html.erb +4 -0
- data/app/views/authorizations/new.html.erb +27 -0
- data/app/views/site/clients/_form.html.erb +39 -0
- data/app/views/site/clients/_new.modal.html.erb +9 -0
- data/app/views/site/clients/_presentation.html.erb +13 -0
- data/app/views/site/clients/index.html.erb +42 -0
- data/app/views/site/clients/new.html.erb +10 -0
- data/app/views/site/clients/show.html.erb +44 -0
- data/config/locales/en.yml +29 -0
- data/config/locales/es.yml +29 -0
- data/config/routes.rb +10 -0
- data/db/migrate/20130115102300_create_social_stream_oauth2_server.rb +25 -0
- data/lib/generators/social_stream/oauth2_server/install_generator.rb +23 -0
- data/lib/social_stream-oauth2_server.rb +19 -0
- data/lib/social_stream/migrations/oauth2_server.rb +8 -0
- data/lib/social_stream/oauth2_server.rb +5 -0
- data/lib/social_stream/oauth2_server/controllers/helpers.rb +41 -0
- data/lib/social_stream/oauth2_server/engine.rb +21 -0
- data/lib/social_stream/oauth2_server/models/actor.rb +11 -0
- data/lib/social_stream/oauth2_server/models/user.rb +35 -0
- data/lib/social_stream/oauth2_server/token_endpoint.rb +41 -0
- data/lib/social_stream/oauth2_server/version.rb +5 -0
- data/lib/tasks/db/populate.rake +37 -0
- data/social_stream-oauth2_server.gemspec +19 -0
- data/spec/controllers/authorizations_controller_spec.rb +179 -0
- data/spec/controllers/dummy_controller_spec.rb +43 -0
- data/spec/factories/site_client.rb +6 -0
- data/spec/models/relation/auth_spec.rb +15 -0
- data/spec/models/site/client_spec.rb +22 -0
- metadata +156 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
<%= render partial: 'toolbar/home' %>
|
2
|
+
|
3
|
+
<section id="oauth2_server">
|
4
|
+
<h1>
|
5
|
+
<%= @client.name %>
|
6
|
+
</h1>
|
7
|
+
|
8
|
+
<hr class="soften">
|
9
|
+
<div class="content">
|
10
|
+
<a class="pull-left" href="#">
|
11
|
+
<img class="media-object" alt="application image" style="width: 100px; height: 100px;" src="assets/user.png">
|
12
|
+
</a>
|
13
|
+
<article class="media box">
|
14
|
+
<div class="media-body">
|
15
|
+
<h4>
|
16
|
+
<%= Site::Client.human_attribute_name :url %>
|
17
|
+
</h4>
|
18
|
+
<div class="result">
|
19
|
+
<%= link_to @client.url, @client.url%>
|
20
|
+
</div>
|
21
|
+
<h4>
|
22
|
+
<%= Site::Client.human_attribute_name :callback_url %>
|
23
|
+
</h4>
|
24
|
+
<div class="result">
|
25
|
+
<%= @client.callback_url %>
|
26
|
+
</div>
|
27
|
+
<h4>
|
28
|
+
<%= Site::Client.human_attribute_name :id %>
|
29
|
+
</h4>
|
30
|
+
<div class="result">
|
31
|
+
<%= @client.id %>
|
32
|
+
</div>
|
33
|
+
<h4>
|
34
|
+
<%= Site::Client.human_attribute_name :secret %>
|
35
|
+
</h4>
|
36
|
+
<div class="result client_secret">
|
37
|
+
<p>
|
38
|
+
<%= @client.secret %>
|
39
|
+
</p>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</article>
|
43
|
+
</div>
|
44
|
+
</section>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
en:
|
2
|
+
account:
|
3
|
+
applications: "Applications"
|
4
|
+
activerecord:
|
5
|
+
attributes:
|
6
|
+
site/client:
|
7
|
+
callback_url: "Callback URL"
|
8
|
+
id: "Client ID"
|
9
|
+
name: "Name"
|
10
|
+
secret: "Client Secret"
|
11
|
+
url: "URL"
|
12
|
+
authorization:
|
13
|
+
form:
|
14
|
+
accept: "Accept"
|
15
|
+
cancel: "Cancel"
|
16
|
+
new:
|
17
|
+
title: "Authorize %{client}?"
|
18
|
+
permission:
|
19
|
+
title: "The site %{client} will be able to:"
|
20
|
+
permission:
|
21
|
+
public_info: "Read your public information"
|
22
|
+
site:
|
23
|
+
client:
|
24
|
+
added: "Added sites"
|
25
|
+
index:
|
26
|
+
title: "Client sites"
|
27
|
+
new:
|
28
|
+
link: "Add site"
|
29
|
+
title: "Register new client site"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
es:
|
2
|
+
account:
|
3
|
+
applications: "Aplicaciones"
|
4
|
+
activerecord:
|
5
|
+
attributes:
|
6
|
+
site/client:
|
7
|
+
callback_url: "Callback URL"
|
8
|
+
id: "Client ID"
|
9
|
+
name: "Nombre"
|
10
|
+
secret: "Client Secret"
|
11
|
+
url: "URL"
|
12
|
+
authorizations:
|
13
|
+
form:
|
14
|
+
accept: "Aceptar"
|
15
|
+
cancel: "Cancelar"
|
16
|
+
new:
|
17
|
+
title: "¿Autorizar %{client}?"
|
18
|
+
permission:
|
19
|
+
title: "El sitio %{client} será capaz de:"
|
20
|
+
permission:
|
21
|
+
public_info: "Acceder a tu información pública"
|
22
|
+
site:
|
23
|
+
client:
|
24
|
+
added: "Sitios añadidos"
|
25
|
+
index:
|
26
|
+
title: "Sitios"
|
27
|
+
new:
|
28
|
+
link: "Añadir sitio"
|
29
|
+
title: "Registrar nuevo sitio"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
match 'oauth2/authorize', to: 'authorizations#new'
|
3
|
+
post 'oauth2/token', to: proc { |env| SocialStream::Oauth2Server::TokenEndpoint.new.call(env) }
|
4
|
+
|
5
|
+
resources :authorizations, only: :create
|
6
|
+
|
7
|
+
namespace "site" do
|
8
|
+
resources :clients
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class CreateSocialStreamOauth2Server < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :oauth2_tokens do |t|
|
4
|
+
t.string :type
|
5
|
+
|
6
|
+
t.integer :user_id
|
7
|
+
t.integer :site_id
|
8
|
+
t.string :token
|
9
|
+
|
10
|
+
t.string :redirect_uri
|
11
|
+
t.integer :refresh_token_id
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
t.datetime :expires_at
|
15
|
+
end
|
16
|
+
|
17
|
+
add_index "oauth2_tokens", :user_id, :name => "index_oauth2_tokens_on_user_id"
|
18
|
+
add_index "oauth2_tokens", :site_id, :name => "index_oauth2_tokens_on_site_id"
|
19
|
+
add_index "oauth2_tokens", :token, :name => "index_oauth2_tokens_on_token"
|
20
|
+
add_index "oauth2_tokens", :refresh_token_id, :name => "index_oauth2_tokens_on_refresh_token_id"
|
21
|
+
|
22
|
+
add_foreign_key "oauth2_tokens", "sites", :name => "index_oauth2_tokens_on_site_id"
|
23
|
+
add_foreign_key "oauth2_tokens", "users", :name => "index_oauth2_tokens_on_user_id"
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class SocialStream::Oauth2Server::InstallGenerator < Rails::Generators::Base
|
2
|
+
include Rails::Generators::Migration
|
3
|
+
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def create_migration_file
|
7
|
+
require 'rake'
|
8
|
+
Rails.application.load_tasks
|
9
|
+
Rake::Task['railties:install:migrations'].reenable
|
10
|
+
Rake::Task['social_stream_oauth2_server_engine:install:migrations'].invoke
|
11
|
+
end
|
12
|
+
|
13
|
+
def require_javascripts
|
14
|
+
inject_into_file 'app/assets/javascripts/application.js',
|
15
|
+
"//= require social_stream-oauth2_server\n",
|
16
|
+
:before => '//= require_tree .'
|
17
|
+
end
|
18
|
+
|
19
|
+
def require_stylesheets
|
20
|
+
append_file 'app/assets/stylesheets/social_stream.css.sass',
|
21
|
+
"@import social_stream-oauth2_server\n"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'social_stream-base'
|
2
|
+
|
3
|
+
require 'rack/oauth2'
|
4
|
+
|
5
|
+
module SocialStream
|
6
|
+
module Oauth2Server
|
7
|
+
module Controllers
|
8
|
+
autoload :Helpers, 'social_stream/oauth2_server/controllers/helpers'
|
9
|
+
end
|
10
|
+
|
11
|
+
module Models
|
12
|
+
autoload :Actor, 'social_stream/oauth2_server/models/actor'
|
13
|
+
autoload :User, 'social_stream/oauth2_server/models/user'
|
14
|
+
end
|
15
|
+
autoload :TokenEndpoint, 'social_stream/oauth2_server/token_endpoint'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'social_stream/oauth2_server/engine'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SocialStream
|
2
|
+
module Oauth2Server
|
3
|
+
module Controllers
|
4
|
+
# Common methods added to ApplicationController
|
5
|
+
module Helpers
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def authenticate_user!(opts = {})
|
9
|
+
oauth2_token? || super
|
10
|
+
end
|
11
|
+
|
12
|
+
def current_subject
|
13
|
+
super ||
|
14
|
+
@current_subject ||=
|
15
|
+
current_from_oauth_token(:client)
|
16
|
+
end
|
17
|
+
|
18
|
+
def current_user
|
19
|
+
super ||
|
20
|
+
@current_user ||=
|
21
|
+
current_from_oauth_token(:user)
|
22
|
+
end
|
23
|
+
|
24
|
+
def current_from_oauth_token(type)
|
25
|
+
return unless oauth2_token?
|
26
|
+
|
27
|
+
oauth2_token.__send__(type)
|
28
|
+
end
|
29
|
+
|
30
|
+
def oauth2_token
|
31
|
+
@oauth2_token ||=
|
32
|
+
request.env[Rack::OAuth2::Server::Resource::ACCESS_TOKEN]
|
33
|
+
end
|
34
|
+
|
35
|
+
def oauth2_token?
|
36
|
+
oauth2_token.present?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SocialStream
|
2
|
+
module Oauth2Server
|
3
|
+
class Engine < Rails::Engine
|
4
|
+
config.app_middleware.use Rack::OAuth2::Server::Resource::Bearer, 'Social Stream OAuth2' do |req|
|
5
|
+
Oauth2Token::AccessToken.valid.find_by_token(req.access_token) || req.invalid_token!
|
6
|
+
end
|
7
|
+
|
8
|
+
initializer "social_stream-oauth2_server.controller.helpers",
|
9
|
+
after: "social_stream-base.controller.helpers" do
|
10
|
+
ActiveSupport.on_load(:action_controller) do
|
11
|
+
include SocialStream::Oauth2Server::Controllers::Helpers
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
initializer "social_stream-oauth2_server.add_filters" do |app|
|
16
|
+
app.config.filter_parameters += [:secret]
|
17
|
+
app.config.filter_parameters.uniq
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SocialStream
|
2
|
+
module Oauth2Server
|
3
|
+
module Models
|
4
|
+
module User
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
has_many :oauth2_tokens,
|
9
|
+
dependent: :destroy
|
10
|
+
|
11
|
+
has_many :authorization_codes,
|
12
|
+
class_name: 'Oauth2Token::AuthorizationCode'
|
13
|
+
|
14
|
+
has_many :access_tokens,
|
15
|
+
class_name: 'Oauth2Token::AccessToken'
|
16
|
+
|
17
|
+
has_many :refresh_tokens,
|
18
|
+
class_name: 'Oauth2Token::RefreshToken'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Is {#client} authorized by this {User}
|
22
|
+
def client_authorized?(client)
|
23
|
+
contact_to!(client).relation_ids.include? Relation::Auth.instance.id
|
24
|
+
end
|
25
|
+
|
26
|
+
# Create a new tie to {Site::Client}
|
27
|
+
def client_authorize!(client)
|
28
|
+
unless contact_to!(client).relation_ids.include?(Relation::Auth.instance.id)
|
29
|
+
contact_to!(client).relation_ids += [ Relation::Auth.instance.id ]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SocialStream
|
2
|
+
module Oauth2Server
|
3
|
+
class TokenEndpoint
|
4
|
+
def call(env)
|
5
|
+
authenticator.call(env)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def authenticator
|
11
|
+
Rack::OAuth2::Server::Token.new do |req, res|
|
12
|
+
client = Site::Client.find(req.client_id) || req.invalid_client!
|
13
|
+
client.secret == req.client_secret || req.invalid_client!
|
14
|
+
|
15
|
+
case req.grant_type
|
16
|
+
when :authorization_code
|
17
|
+
code = Oauth2Token::AuthorizationCode.valid.find_by_token(req.code)
|
18
|
+
req.invalid_grant! if code.blank? || code.redirect_uri != req.redirect_uri
|
19
|
+
|
20
|
+
res.access_token = code.access_token.to_bearer_token(:with_refresh_token)
|
21
|
+
when :password
|
22
|
+
# TODO
|
23
|
+
account = Account.find_by_username_and_password(req.username, req.password) || req.invalid_grant!
|
24
|
+
res.access_token = account.access_tokens.create(:client => client).to_bearer_token(:with_refresh_token)
|
25
|
+
when :client_credentials
|
26
|
+
# NOTE: client is already authenticated here.
|
27
|
+
res.access_token = client.access_tokens.create!.to_bearer_token
|
28
|
+
when :refresh_token
|
29
|
+
refresh_token = client.refresh_tokens.valid.find_by_token(req.refresh_token)
|
30
|
+
req.invalid_grant! unless refresh_token
|
31
|
+
res.access_token = refresh_token.access_tokens.create!.to_bearer_token
|
32
|
+
else
|
33
|
+
# NOTE: extended assertion grant_types are not supported yet.
|
34
|
+
req.unsupported_grant_type!
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
namespace :db do
|
2
|
+
namespace :populate do
|
3
|
+
desc "Create populate data with client sites"
|
4
|
+
task create: 'create:site_clients'
|
5
|
+
|
6
|
+
namespace :create do
|
7
|
+
desc "Add client sites populate data"
|
8
|
+
task site_clients: :read_environment do
|
9
|
+
puts 'Site Client population (Dummy and 9 clients more)'
|
10
|
+
|
11
|
+
start = Time.now
|
12
|
+
|
13
|
+
# Create dummy site
|
14
|
+
aid = Actor.find_by_slug('demo').id
|
15
|
+
|
16
|
+
s = Site::Client.create! name: 'Dummy',
|
17
|
+
description: "Social Stream's spec/dummy application",
|
18
|
+
url: 'http://localhost:3000',
|
19
|
+
callback_url: 'http://localhost:3000/users/auth/socialstream/callback',
|
20
|
+
author_id: aid
|
21
|
+
|
22
|
+
s.update_attributes! secret: "f9974ce87c455544f61cc960b58cf833eb039875ef27029449408857879a1e87283c86558e46fa431d37a3c5590ba92612c51dfd0872ccff35cbecf3910eaa02"
|
23
|
+
|
24
|
+
9.times do
|
25
|
+
domain = Forgery::Internet.domain_name
|
26
|
+
Site::Client.create! name: Forgery::Name.company_name,
|
27
|
+
description: Forgery::LoremIpsum.sentence(random: true),
|
28
|
+
url: "https://#{ domain }",
|
29
|
+
callback_url: "https://#{ domain }/callback",
|
30
|
+
author: User.all[rand(User.all.size)]
|
31
|
+
end
|
32
|
+
|
33
|
+
puts " -> #{ (Time.now - start).round(4) }s"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'lib', 'social_stream', 'oauth2_server', 'version')
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "social_stream-oauth2_server"
|
6
|
+
s.version = SocialStream::Oauth2Server::VERSION.dup
|
7
|
+
s.authors = ["Antonio Tapiador", "GING - DIT - UPM"]
|
8
|
+
s.summary = "OAuth2 server support for Social Stream, the framework for building social network websites"
|
9
|
+
s.description = "Social Stream is a Ruby on Rails engine providing your application with social networking features and activity streams.\n\nThis gem supplies with OAuth2 server support"
|
10
|
+
s.email = "social-stream@dit.upm.es"
|
11
|
+
s.homepage = "http://github.com/ging/social_stream-oauth2_server"
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
|
14
|
+
# Gem dependencies
|
15
|
+
s.add_runtime_dependency('social_stream-base', '~> 2.0.0.beta1')
|
16
|
+
s.add_runtime_dependency('rack-oauth2', '~> 1.0.0')
|
17
|
+
|
18
|
+
s.add_development_dependency('rspec-rails', '~> 2.8.0')
|
19
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AuthorizationsController do
|
4
|
+
let(:redirect_uri) { "https://test.host/callback" }
|
5
|
+
let(:token) { "token" }
|
6
|
+
|
7
|
+
let(:authorization_code) { double :authorization_code, token: token }
|
8
|
+
let(:user) { double :user, language: :en }
|
9
|
+
let(:client) { double :client, callback_url: redirect_uri }
|
10
|
+
|
11
|
+
context "#new" do
|
12
|
+
context "without authentication" do
|
13
|
+
it "should redirect to login" do
|
14
|
+
get :new
|
15
|
+
|
16
|
+
response.should redirect_to(:new_user_session)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "with authentication" do
|
21
|
+
before do
|
22
|
+
controller.stub(:authenticate_user!)
|
23
|
+
controller.stub(:current_user) { user }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "without client_id" do
|
27
|
+
it "should respond with bad request" do
|
28
|
+
get :new
|
29
|
+
|
30
|
+
response.should be_bad_request
|
31
|
+
assigns(:error).to_s.should eq('bad_request')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with client_id" do
|
36
|
+
before :each do
|
37
|
+
@params = { client_id: 7 }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return bad request" do
|
41
|
+
get :new, @params
|
42
|
+
|
43
|
+
response.should be_bad_request
|
44
|
+
assigns(:error).to_s.should eq("invalid_request :: 'response_type' required.")
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with response code" do
|
48
|
+
before :each do
|
49
|
+
@params.merge! response_type: 'code'
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should raise RecordNotFound" do
|
53
|
+
lambda { get :new, @params }.should raise_error(ActiveRecord::RecordNotFound)
|
54
|
+
end
|
55
|
+
|
56
|
+
context "with valid client" do
|
57
|
+
before do
|
58
|
+
Site::Client.should_receive(:find).with("7") { client }
|
59
|
+
end
|
60
|
+
|
61
|
+
context "not authorized" do
|
62
|
+
before do
|
63
|
+
user.stub(:client_authorized?) { false }
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should render new" do
|
67
|
+
get :new, @params
|
68
|
+
|
69
|
+
response.should be_success
|
70
|
+
response.should render_template('new')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "authorized" do
|
75
|
+
before do
|
76
|
+
user.stub(:client_authorized?) { true }
|
77
|
+
|
78
|
+
codes = double(:codes)
|
79
|
+
|
80
|
+
user.stub(:authorization_codes) { codes }
|
81
|
+
|
82
|
+
codes.should_receive(:create!).with(client: client, redirect_uri: redirect_uri) { authorization_code }
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should render new" do
|
86
|
+
get :new, @params
|
87
|
+
|
88
|
+
response.should redirect_to("#{ redirect_uri }?code=#{ token }")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#create" do
|
98
|
+
context "without authentication" do
|
99
|
+
it "should redirect to login" do
|
100
|
+
post :create
|
101
|
+
|
102
|
+
response.should redirect_to(:new_user_session)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "with authentication" do
|
107
|
+
before do
|
108
|
+
controller.stub(:authenticate_user!)
|
109
|
+
controller.stub(:current_user) { user }
|
110
|
+
end
|
111
|
+
|
112
|
+
context "without client_id" do
|
113
|
+
it "should respond with bad request" do
|
114
|
+
post :create
|
115
|
+
|
116
|
+
response.should be_bad_request
|
117
|
+
assigns(:error).to_s.should eq('bad_request')
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "with client_id" do
|
122
|
+
before :each do
|
123
|
+
@params = { client_id: 7 }
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return bad request" do
|
127
|
+
post :create, @params
|
128
|
+
|
129
|
+
response.should be_bad_request
|
130
|
+
assigns(:error).to_s.should eq("invalid_request :: 'response_type' required.")
|
131
|
+
end
|
132
|
+
|
133
|
+
context "with response code" do
|
134
|
+
before :each do
|
135
|
+
@params.merge! response_type: 'code'
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should raise RecordNotFound" do
|
139
|
+
lambda { post :create, @params }.should raise_error(ActiveRecord::RecordNotFound)
|
140
|
+
end
|
141
|
+
|
142
|
+
context "with valid client" do
|
143
|
+
before do
|
144
|
+
Site::Client.should_receive(:find).with("7") { client }
|
145
|
+
end
|
146
|
+
|
147
|
+
context "not accepted" do
|
148
|
+
it "should redirect" do
|
149
|
+
post :create, @params
|
150
|
+
|
151
|
+
response.should redirect_to("#{ redirect_uri }?error=access_denied&error_description=The+end-user+or+authorization+server+denied+the+request.")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "accepted" do
|
156
|
+
before do
|
157
|
+
@params.merge!(accept: "true")
|
158
|
+
|
159
|
+
user.should_receive(:client_authorize!).with(client)
|
160
|
+
|
161
|
+
codes = double(:codes)
|
162
|
+
|
163
|
+
user.stub(:authorization_codes) { codes }
|
164
|
+
|
165
|
+
codes.should_receive(:create!).with(client: client, redirect_uri: redirect_uri) { authorization_code }
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should respond with test" do
|
169
|
+
post :create, @params
|
170
|
+
|
171
|
+
response.should redirect_to("#{ redirect_uri }?code=#{ token }")
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|