omnitoken 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +9 -0
- data/README.md +70 -0
- data/Rakefile +10 -0
- data/bin/omnitoken +103 -0
- data/config.ru +3 -0
- data/omnitoken_app.rb +124 -0
- data/public/style.css +146 -0
- data/templates/facebook.yml +2 -0
- data/templates/twitter.yml +2 -0
- data/test/helper.rb +10 -0
- data/test/omnitoken_app_test.rb +14 -0
- data/views/error.haml +3 -0
- data/views/index.haml +11 -0
- data/views/layout.haml +10 -0
- data/views/results.haml +18 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3ace4482f49697143d37ce315b327c2a84ed71b3
|
4
|
+
data.tar.gz: 99e1e737d587e96b9a4ee7519e44df1a0161ff19
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 20970c131a123db1d4f48830429703e4fb3b191d770c2b47383a99f60529fc99e0167ba5a7c6e3705020c9af4507d5d07f10f1156ef55d009d44526b7a8ed6c7
|
7
|
+
data.tar.gz: 508f29a138b1c193e26658082e036ec4424c7c552441195c6d7adcb01104ea081fc72366776c1085611fa43c259d37124631b9f489adb89534e064ec402100a3
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# OmniToken
|
2
|
+
|
3
|
+
## Introduction
|
4
|
+
OmniToken is a handy tool for getting OAuth tokens from multiple providers. It brings up a web page interface which lists the popular "Login with XXX" social buttons and displays the token and other basic information after user finishes the authentication flow.
|
5
|
+
|
6
|
+
It is a tiny Sinatra-based web application.
|
7
|
+
|
8
|
+
It heavily relies on [OmniAuth](https://github.com/intridea/omniauth) and its strategies. Theoretically, any OAuth provider can be supported as long as there is a OmniAuth strategy for it. It can be easily achieved by installing the startegy gem and adding a config file.
|
9
|
+
|
10
|
+
## Get Started
|
11
|
+
To install the latest stable version, run:
|
12
|
+
|
13
|
+
`gem install omnitoken`
|
14
|
+
|
15
|
+
After the gem and its dependencies are installed, run:
|
16
|
+
|
17
|
+
`omnitoken -s`
|
18
|
+
|
19
|
+
A web server is started. Visit `http://localhost:4567` in the web browser and you will see a page with the "No OAuth providers are configured." message.
|
20
|
+
|
21
|
+
Follow next section to add some providers. You need to restart the web server after adding new providers.
|
22
|
+
|
23
|
+
## Add Providers
|
24
|
+
To get the token from a provider, a tiny configuration file is required. OmniToken has been tested with following providers and a configuration template is shipped for each of them:
|
25
|
+
* Twitter
|
26
|
+
* Facebook
|
27
|
+
|
28
|
+
### Twitter
|
29
|
+
First, install the twitter strategy gem:
|
30
|
+
|
31
|
+
`gem install omniauth-twitter`
|
32
|
+
|
33
|
+
Copy the twitter template by running:
|
34
|
+
|
35
|
+
`omnitoken -a twitter`
|
36
|
+
|
37
|
+
A `twitter.yml` file will be created in `providers` folder in your working directory. Open it using your favorite editor and fill the fileds. The values can be found on your twitter application page you registered beforehand.
|
38
|
+
|
39
|
+
### Facebook
|
40
|
+
First, install the facebook strategy gem:
|
41
|
+
|
42
|
+
`gem install omniauth-facebook`
|
43
|
+
|
44
|
+
Copy the facebook template by running:
|
45
|
+
|
46
|
+
`omnitoken -a facebook`
|
47
|
+
|
48
|
+
A `facebook.yml` file will be created in `providers` folder in your working directory. Open it using your favorite editor and fill the fileds. The values can be found on your facebook application page you registered beforehand.
|
49
|
+
|
50
|
+
### Others
|
51
|
+
Theoretically, OmniToken can be support any provider as long as there is a OmniAuth strategy for it. Please follow these steps to add a provider which doesn't have a shipped template.
|
52
|
+
|
53
|
+
First, find and install the strategy gem for your provider. Assume it is `omniauth-example`.
|
54
|
+
|
55
|
+
`gem install omniauth-example`
|
56
|
+
|
57
|
+
Create a file named `example.ym` and put it in `providers` folder under your working directory. **NOTE: all providers configuration file should be put in `providers`.**
|
58
|
+
|
59
|
+
Refer to startegies' documentation and get the required argumements. Add a corresponding value to each argument. For example, the arguments are `foo` and `bar`. The `example.yml` should look like this:
|
60
|
+
|
61
|
+
```yaml
|
62
|
+
foo: "xxx"
|
63
|
+
bar: "xxx"
|
64
|
+
```
|
65
|
+
|
66
|
+
## Supported Ruby Versions
|
67
|
+
OmniToken is tested under 2.0.0.
|
68
|
+
|
69
|
+
## License
|
70
|
+
Copyright (c) 2013-2014 Minjie Zha. See [LICENSE](https://github.com/magic003/omnitoken/blob/master/LICENSE-MIT) for details.
|
data/Rakefile
ADDED
data/bin/omnitoken
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# This is the script for running OmniToken application.
|
4
|
+
#
|
5
|
+
# Usage:
|
6
|
+
# omnitoken [options]
|
7
|
+
# Options:
|
8
|
+
# -a, --add name1,name2,nameN
|
9
|
+
# Add the config template for specified OAuth providers
|
10
|
+
# -s, --server Start the web server
|
11
|
+
# -h, --help Display this help message
|
12
|
+
# -v, --version Show OmniToken version
|
13
|
+
#
|
14
|
+
# Author:: Minjie Zha (mailto:minjiezha@gmail.com)
|
15
|
+
# Copyright:: Copyright (c) 2013-2014 Minjie Zha
|
16
|
+
|
17
|
+
require 'optparse'
|
18
|
+
|
19
|
+
begin
|
20
|
+
require 'omnitoken_app'
|
21
|
+
rescue LoadError
|
22
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), *%w[.. omnitoken_app])
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add provider templates.
|
26
|
+
def on_add(names)
|
27
|
+
return if names.nil?
|
28
|
+
provider_dir = OmniTokenApp::PROVIDER_DIR
|
29
|
+
# create the providers folder if it doesn't exist
|
30
|
+
unless names.empty? || Dir.exists?(provider_dir)
|
31
|
+
$stdout.puts "Creating #{provider_dir} folder"
|
32
|
+
Dir.mkdir(provider_dir)
|
33
|
+
end
|
34
|
+
|
35
|
+
template_dir = File.join(
|
36
|
+
File.expand_path(File.dirname(__FILE__)),
|
37
|
+
*%w[.. templates])
|
38
|
+
names.each do |n|
|
39
|
+
file = "#{n.downcase}.yml"
|
40
|
+
# check if the template file is available
|
41
|
+
unless File.exists?(File.join(template_dir, file))
|
42
|
+
$stderr.puts "Template for #{n} is not available. "\
|
43
|
+
"Please follow the OmniToken README to create its config file."
|
44
|
+
next
|
45
|
+
end
|
46
|
+
|
47
|
+
# check if the config file is already there
|
48
|
+
if File.exists?(File.join(provider_dir, file))
|
49
|
+
overwrite = loop do
|
50
|
+
$stdout.print("File #{file} already exists. Overwrite it?(y/Y/n/N):")
|
51
|
+
ans = $stdin.gets.chomp
|
52
|
+
break true if 'y'.eql?(ans.downcase)
|
53
|
+
break false if 'n'.eql?(ans.downcase)
|
54
|
+
end
|
55
|
+
next unless overwrite
|
56
|
+
end
|
57
|
+
|
58
|
+
# copy the template file
|
59
|
+
$stdout.puts "Copying template #{file}"
|
60
|
+
FileUtils.cp(File.join(template_dir, file),
|
61
|
+
File.join(provider_dir, ''))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Starts the web server.
|
66
|
+
def on_server()
|
67
|
+
puts 'Starting OmniToken web server'
|
68
|
+
OmniTokenApp.run!
|
69
|
+
end
|
70
|
+
|
71
|
+
OptionParser.new do |opts|
|
72
|
+
opts.banner = "Usage: omnitoken [options]"
|
73
|
+
|
74
|
+
opts.separator ""
|
75
|
+
opts.separator "Options:"
|
76
|
+
|
77
|
+
opts.on('-a', '--add name1,name2,nameN', Array, 'Add the config template for specified OAuth providers') do |names|
|
78
|
+
on_add(names)
|
79
|
+
exit
|
80
|
+
end
|
81
|
+
|
82
|
+
opts.on('-s', '--server', 'Start the web server') do
|
83
|
+
on_server()
|
84
|
+
exit
|
85
|
+
end
|
86
|
+
|
87
|
+
opts.on_tail('-h', '--help', 'Display this help message') do
|
88
|
+
puts opts
|
89
|
+
exit
|
90
|
+
end
|
91
|
+
|
92
|
+
opts.on_tail('-v', '--version', 'Show OmniToken version') do
|
93
|
+
puts OmniTokenApp::VERSION
|
94
|
+
exit
|
95
|
+
end
|
96
|
+
|
97
|
+
opts.on() do
|
98
|
+
puts opts
|
99
|
+
exit
|
100
|
+
end
|
101
|
+
|
102
|
+
end.parse!
|
103
|
+
|
data/config.ru
ADDED
data/omnitoken_app.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'haml'
|
3
|
+
require 'omniauth'
|
4
|
+
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
# This is the Sinatra application for getting tokens.
|
8
|
+
class OmniTokenApp < Sinatra::Base
|
9
|
+
# version number
|
10
|
+
VERSION = '0.0.1'
|
11
|
+
|
12
|
+
# configuration folder for various OAuth providers
|
13
|
+
PROVIDER_DIR = 'providers'
|
14
|
+
|
15
|
+
enable :sessions
|
16
|
+
set :haml, {:format => :html5, :layout => :layout}
|
17
|
+
|
18
|
+
before '/*' do
|
19
|
+
# load providers and save in the application level
|
20
|
+
if !settings.respond_to?(:providers) || settings.providers.nil?
|
21
|
+
load_providers()
|
22
|
+
self.class.set :providers, @providers
|
23
|
+
else
|
24
|
+
@providers = settings.providers
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# home page
|
29
|
+
get '/' do
|
30
|
+
haml :index
|
31
|
+
end
|
32
|
+
|
33
|
+
# callback route for providers
|
34
|
+
get "#{OmniAuth.config.path_prefix}/:provider/callback" do |p|
|
35
|
+
auth = env['omniauth.auth']
|
36
|
+
provider = get_provider(p)
|
37
|
+
not_found if provider.nil?
|
38
|
+
# get the arguments and provided values for the provider
|
39
|
+
args = {}
|
40
|
+
p_args = provider[:args].dup
|
41
|
+
provider[:klass].args.each do |arg|
|
42
|
+
args[arg] = p_args.shift
|
43
|
+
end
|
44
|
+
haml :results, :locals => { auth: env['omniauth.auth'], args: args}
|
45
|
+
end
|
46
|
+
|
47
|
+
# OAuth failure route
|
48
|
+
get "#{OmniAuth.config.path_prefix}/failure" do
|
49
|
+
[400, haml(:error, :locals => { message: params[:message] })]
|
50
|
+
end
|
51
|
+
|
52
|
+
not_found do
|
53
|
+
[404, haml(:error, :locals => { message: "Page Not Found" })]
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# Gets the loaded provider by name
|
60
|
+
def get_provider(name)
|
61
|
+
provider = nil
|
62
|
+
@providers.each do |p|
|
63
|
+
provider = p if p[:id].eql?(name.to_sym)
|
64
|
+
end
|
65
|
+
provider
|
66
|
+
end
|
67
|
+
|
68
|
+
# Loads providers from the configuration files
|
69
|
+
def load_providers
|
70
|
+
@providers = []
|
71
|
+
Dir.glob(File.join(PROVIDER_DIR, '*.yml')) do |file|
|
72
|
+
name = File.basename(file, '.yml').to_sym
|
73
|
+
# require ruby files for the strategy
|
74
|
+
strategy = require_strategy(name)
|
75
|
+
@providers << { id: name,
|
76
|
+
display_name: OmniAuth::Utils.camelize(name),
|
77
|
+
path: "#{OmniAuth.config.path_prefix}/#{name}",
|
78
|
+
args: read_strategy_arg(strategy, file),
|
79
|
+
klass: strategy
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
# set the strategies as a middleware
|
84
|
+
use_strategy_middleware
|
85
|
+
end
|
86
|
+
|
87
|
+
# Sets the OmniAuth builder as a middleware
|
88
|
+
def use_strategy_middleware
|
89
|
+
providers = @providers
|
90
|
+
self.class.use OmniAuth::Builder do
|
91
|
+
providers.each do |p|
|
92
|
+
provider p[:id], *p[:args]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Reads the arguments for a strategy from the configuration file.
|
98
|
+
def read_strategy_arg(strategy, file)
|
99
|
+
args = []
|
100
|
+
yaml = YAML::load(File.open(file))
|
101
|
+
strategy.args.each do |arg|
|
102
|
+
if yaml[arg.to_s].nil?
|
103
|
+
fail "The #{arg} argument is not provided in #{file}."
|
104
|
+
else
|
105
|
+
args << yaml[arg.to_s]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
args
|
109
|
+
end
|
110
|
+
|
111
|
+
# Requires the ruby file for a strategy.
|
112
|
+
def require_strategy(name)
|
113
|
+
begin
|
114
|
+
require "omniauth-#{name}"
|
115
|
+
OmniAuth::Strategies.const_get(OmniAuth::Utils.camelize(name))
|
116
|
+
rescue LoadError => e
|
117
|
+
fail e, "Could not find matching strategy for #{name}. You may need to install an additional gem (such as omniauth-#{name})."
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Run this application
|
122
|
+
run! if app_file == $0
|
123
|
+
|
124
|
+
end
|
data/public/style.css
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
/* global */
|
2
|
+
body {
|
3
|
+
font-family: Helvetica, Arial, sans-serif;
|
4
|
+
color: #333333;
|
5
|
+
font-size: 14px;
|
6
|
+
line-height: 1.5;
|
7
|
+
background: none repeat scroll 0 0 #F9F9F9;
|
8
|
+
}
|
9
|
+
|
10
|
+
h1 {
|
11
|
+
font-size: 80px;
|
12
|
+
line-height: 1.15;
|
13
|
+
}
|
14
|
+
|
15
|
+
h2 {
|
16
|
+
font-size: 2em;
|
17
|
+
line-height: 1.15;
|
18
|
+
}
|
19
|
+
|
20
|
+
a {
|
21
|
+
text-decoration: none;
|
22
|
+
}
|
23
|
+
|
24
|
+
/* layout */
|
25
|
+
#container {
|
26
|
+
margin: 0 auto;
|
27
|
+
}
|
28
|
+
|
29
|
+
/* the social buttons styles are copied from https://grove.io/login */
|
30
|
+
#social_buttons {
|
31
|
+
width: 460px;
|
32
|
+
background: none repeat scroll 0 0 white;
|
33
|
+
border-radius: 5px 5px 5px 5px;
|
34
|
+
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
|
35
|
+
margin: 40px auto 20px;
|
36
|
+
padding: 30px;
|
37
|
+
}
|
38
|
+
|
39
|
+
#social_buttons h2 {
|
40
|
+
border-bottom: 1px solid #F0F0F0;
|
41
|
+
margin-bottom: 20px;
|
42
|
+
margin-top: 0;
|
43
|
+
padding-bottom: 10px
|
44
|
+
}
|
45
|
+
|
46
|
+
#social_buttons ul {
|
47
|
+
text-align: center;
|
48
|
+
list-style: none outside none;
|
49
|
+
margin: 5px;
|
50
|
+
padding: 5px;
|
51
|
+
}
|
52
|
+
|
53
|
+
#social_buttons li {
|
54
|
+
margin: 20px;
|
55
|
+
padding-bottom: 15px;
|
56
|
+
}
|
57
|
+
|
58
|
+
/* This button style is copied from bitbucket's Create repository button */
|
59
|
+
.connect_button, .connect_buton:visited {
|
60
|
+
font-size: 16px;
|
61
|
+
-moz-box-sizing: border-box;
|
62
|
+
background: linear-gradient(to bottom, #FFFFFF 0%, #F2F2F2 100%) repeat scroll 0 0 transparent;
|
63
|
+
border: 1px solid #CCCCCC;
|
64
|
+
border-radius: 3.01px 3.01px 3.01px 3.01px;
|
65
|
+
color: #333333;
|
66
|
+
cursor: pointer;
|
67
|
+
display: inline-block;
|
68
|
+
padding: 4px 20px;
|
69
|
+
text-decoration: none;
|
70
|
+
text-shadow: 0 1px 0 white;
|
71
|
+
vertical-align: baseline;
|
72
|
+
white-space: nowrap;
|
73
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
74
|
+
width: 200px;
|
75
|
+
}
|
76
|
+
|
77
|
+
.connect_button:hover {
|
78
|
+
background: linear-gradient(to bottom, #FFFFFF 0%, #F7F7F7 100%) repeat scroll 0 0 transparent;
|
79
|
+
border-color: #999999;
|
80
|
+
color: #000000;
|
81
|
+
text-decoration: none;
|
82
|
+
}
|
83
|
+
|
84
|
+
.connect_button:active {
|
85
|
+
background-color: #F2F2F2;
|
86
|
+
background-image: none;
|
87
|
+
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.1) inset;
|
88
|
+
text-decoration: none;
|
89
|
+
text-shadow: none;
|
90
|
+
}
|
91
|
+
|
92
|
+
.connect_button em {
|
93
|
+
font-style: normal;
|
94
|
+
font-weight: bold;
|
95
|
+
}
|
96
|
+
|
97
|
+
#error {
|
98
|
+
text-align: center;
|
99
|
+
margin: 40px auto 20px;
|
100
|
+
padding: 30px;
|
101
|
+
}
|
102
|
+
|
103
|
+
#error p {
|
104
|
+
font-size: 20px;
|
105
|
+
font-style: bold;
|
106
|
+
}
|
107
|
+
|
108
|
+
#results {
|
109
|
+
width: 660px;
|
110
|
+
background: none repeat scroll 0 0 white;
|
111
|
+
border-radius: 5px 5px 5px 5px;
|
112
|
+
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
|
113
|
+
margin: 40px auto 20px;
|
114
|
+
padding: 30px;
|
115
|
+
}
|
116
|
+
|
117
|
+
#results h2 {
|
118
|
+
border-bottom: 1px solid #F0F0F0;
|
119
|
+
margin-bottom: 20px;
|
120
|
+
margin-top: 0;
|
121
|
+
padding-bottom: 10px
|
122
|
+
}
|
123
|
+
|
124
|
+
#results table {
|
125
|
+
width: 100%;
|
126
|
+
border-spacing: 0;
|
127
|
+
table-layout: fixed;
|
128
|
+
}
|
129
|
+
|
130
|
+
#results td {
|
131
|
+
padding: 8px 0;
|
132
|
+
border-bottom: 1px solid #F0F0F0;
|
133
|
+
word-wrap: break-word;
|
134
|
+
}
|
135
|
+
|
136
|
+
#results td:first-child {
|
137
|
+
width: 30%;
|
138
|
+
}
|
139
|
+
|
140
|
+
#results tr:hover td {
|
141
|
+
background: none repeat scroll 0 0 #F8F8F8;
|
142
|
+
}
|
143
|
+
|
144
|
+
#results a {
|
145
|
+
float: right;
|
146
|
+
}
|
data/test/helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
2
|
+
|
3
|
+
include Rack::Test::Methods
|
4
|
+
|
5
|
+
def app
|
6
|
+
OmniTokenApp
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'OmniToken app' do
|
10
|
+
it "should show the home page" do
|
11
|
+
get '/'
|
12
|
+
assert_equal 200, last_response.status
|
13
|
+
end
|
14
|
+
end
|
data/views/error.haml
ADDED
data/views/index.haml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#social_buttons
|
2
|
+
%h2 OmniToken
|
3
|
+
- if @providers.nil? || @providers.empty?
|
4
|
+
No OAuth providers are configured.
|
5
|
+
- else
|
6
|
+
%ul
|
7
|
+
- @providers.each do |p|
|
8
|
+
%li
|
9
|
+
%a.connect_button{title: "Login with #{p[:display_name]}", href: "#{p[:path]}"}
|
10
|
+
Login with
|
11
|
+
%em= p[:display_name]
|
data/views/layout.haml
ADDED
data/views/results.haml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#results
|
2
|
+
%h2= auth.provider.capitalize
|
3
|
+
%table
|
4
|
+
%tr
|
5
|
+
%td.attr Uid
|
6
|
+
%td= auth.uid
|
7
|
+
- auth.credentials.each do |key, value|
|
8
|
+
%tr
|
9
|
+
%td.attr= key.capitalize
|
10
|
+
%td= value
|
11
|
+
%tr
|
12
|
+
%td.attr Name
|
13
|
+
%td= auth.info.name
|
14
|
+
- args.each do |key, value|
|
15
|
+
%tr
|
16
|
+
%td.attr= key.capitalize
|
17
|
+
%td= value
|
18
|
+
%a{title: 'Home', href: '/'} << Back to Home
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: omnitoken
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Minjie Zha
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sinatra
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: haml
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: omniauth
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack-test
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: OmniToken is a handy tool for getting OAuth tokens from multiple providers.
|
70
|
+
email:
|
71
|
+
- minjiezha@gmail.com
|
72
|
+
executables:
|
73
|
+
- omnitoken
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- Rakefile
|
78
|
+
- bin/omnitoken
|
79
|
+
- config.ru
|
80
|
+
- omnitoken_app.rb
|
81
|
+
- public/style.css
|
82
|
+
- templates/twitter.yml
|
83
|
+
- templates/facebook.yml
|
84
|
+
- views/error.haml
|
85
|
+
- views/layout.haml
|
86
|
+
- views/results.haml
|
87
|
+
- views/index.haml
|
88
|
+
- test/helper.rb
|
89
|
+
- test/omnitoken_app_test.rb
|
90
|
+
- README.md
|
91
|
+
- Gemfile
|
92
|
+
- CHANGELOG.md
|
93
|
+
homepage: https://github.com/magic003/omnitoken
|
94
|
+
licenses:
|
95
|
+
- MIT
|
96
|
+
metadata: {}
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 2.0.3
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: OmniToken
|
117
|
+
test_files:
|
118
|
+
- test/helper.rb
|
119
|
+
- test/omnitoken_app_test.rb
|