omniauth-marvin 1.0.0
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/.gitignore +9 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +21 -0
- data/README.md +850 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/omniauth-marvin.rb +1 -0
- data/lib/omniauth/marvin.rb +2 -0
- data/lib/omniauth/marvin/version.rb +5 -0
- data/lib/omniauth/strategies/marvin.rb +40 -0
- data/omniauth-marvin.gemspec +34 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8973cc487ddd0c9c10d27e88a1321db5a7796ef5
|
4
|
+
data.tar.gz: d4ad963f6c13f543c53d58aa6fa2d6e2b60389bd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3fb8073c2e268d037117ce83bf8df3cad44a469f1df04ece5892dc45a65c53118a17037d6fe40190ab6e35a73a68c799a0eeaa0cc0d1b2db3c571883deec60c8
|
7
|
+
data.tar.gz: cc5717573ba18833ae87c07b6d39c5e050c948da059169512a5590dc89fc4ed9a4f0e7bdc439668b0ece3a5b3e6c6f08eeed8f113c5b1618478eed8d13d4e0ba
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in omniauth-marvin.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'rake', '~> 10.0'
|
7
|
+
|
8
|
+
group :test do
|
9
|
+
gem 'rspec'
|
10
|
+
gem 'rack-test'
|
11
|
+
gem 'webmock'
|
12
|
+
gem 'simplecov', require: false
|
13
|
+
gem 'coveralls', require: false
|
14
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Samy KACIMI
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,850 @@
|
|
1
|
+
# Omniauth Marvin
|
2
|
+
|
3
|
+
[](https://travis-ci.org/fakenine/omniauth-marvin) [](https://codeclimate.com/repos/5603ccdee30ba01582008c19/feed) [](https://coveralls.io/github/fakenine/omniauth-marvin?branch=master)
|
4
|
+
|
5
|
+
OmniAuth OAuth2 strategy for 42 School.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'omniauth-marvin', github: "fakenine/omniauth-marvin"
|
13
|
+
```
|
14
|
+
|
15
|
+
run `bundle install`
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
Register your application on 42's intranet to receive an API Key.
|
20
|
+
|
21
|
+
Here's an example for adding the middleware to a Rails app in `config/initializers/omniauth.rb`
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
25
|
+
provider :marvin, ENV["FT_ID"], ENV["FT_SECRET"]
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
You can now access the OmniAuth 42 OAuth2 URL: `/auth/marvin`
|
30
|
+
|
31
|
+
## Devise
|
32
|
+
|
33
|
+
If you wish to use this gem with devise, do not use the code snippet above in the Usage section. Instead, follow these steps:
|
34
|
+
|
35
|
+
Add the devise gem to your Gemfile.
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
gem 'devise'
|
39
|
+
```
|
40
|
+
|
41
|
+
run `bundle install`
|
42
|
+
|
43
|
+
#### Generate migrations and models
|
44
|
+
|
45
|
+
```
|
46
|
+
rails g devise:install
|
47
|
+
rails g devise user
|
48
|
+
rails g migration AddNicknameToUsers nickname:string
|
49
|
+
rails g migration AddOmniauthToUsers provider:index uid:index
|
50
|
+
rake db:migrate
|
51
|
+
```
|
52
|
+
|
53
|
+
You can add any additional migration you want. For instance, phone, level, wallet...etc.
|
54
|
+
|
55
|
+
#### Declare the provider
|
56
|
+
`config/initializers/devise.rb`
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
Devise.setup do |config|
|
60
|
+
.
|
61
|
+
.
|
62
|
+
config.omniauth :marvin, ENV["FT_ID"], ENV["FT_SECRET"]
|
63
|
+
.
|
64
|
+
.
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
Don't forget to set the "FT_ID" and "FT_SECRET" (your app id and secret) in your environment variables.
|
69
|
+
|
70
|
+
|
71
|
+
#### Make your model omniauthable
|
72
|
+
|
73
|
+
In this case, `app/models/user.rb`
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
class User < ActiveRecord::Base
|
77
|
+
devise :database_authenticatable, :registerable,
|
78
|
+
:recoverable, :rememberable, :trackable, :validatable,
|
79
|
+
:omniauthable, omniauth_providers: [:marvin]
|
80
|
+
end
|
81
|
+
```
|
82
|
+
|
83
|
+
#### Add the from_omniauth class method to the user model
|
84
|
+
|
85
|
+
`app/models/user.rb`
|
86
|
+
|
87
|
+
Example:
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
def self.from_omniauth(auth)
|
91
|
+
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
|
92
|
+
user.email = auth.info.email
|
93
|
+
user.password = Devise.friendly_token[0,20]
|
94
|
+
user.nickname = auth.info.nickname
|
95
|
+
end
|
96
|
+
end
|
97
|
+
```
|
98
|
+
|
99
|
+
#### Implement a callback in the routes
|
100
|
+
|
101
|
+
`config/routes.rb`
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }
|
105
|
+
```
|
106
|
+
|
107
|
+
#### Create the callbacks controller
|
108
|
+
|
109
|
+
`app/controllers/users/omniauth_callbacks_controller.rb`
|
110
|
+
|
111
|
+
Example:
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
115
|
+
def marvin
|
116
|
+
@user = User.from_omniauth(request.env["omniauth.auth"])
|
117
|
+
|
118
|
+
if @user.persisted?
|
119
|
+
sign_in_and_redirect @user, :event => :authentication
|
120
|
+
set_flash_message(:notice, :success, :kind => "42") if is_navigational_format?
|
121
|
+
else
|
122
|
+
session["devise.marvin_data"] = request.env["omniauth.auth"]
|
123
|
+
redirect_to new_user_registration_url
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
#### Add the Sign Out route
|
130
|
+
|
131
|
+
`config/routes.rb`
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
devise_scope :user do
|
135
|
+
delete 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session_path
|
136
|
+
end
|
137
|
+
```
|
138
|
+
|
139
|
+
#### Login/logout links
|
140
|
+
|
141
|
+
Here's a (very) basic example for login/logout links in the views
|
142
|
+
|
143
|
+
```
|
144
|
+
<%= link_to "Sign in with 42", user_omniauth_authorize_path(:marvin) %>
|
145
|
+
```
|
146
|
+
|
147
|
+
```
|
148
|
+
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
|
149
|
+
```
|
150
|
+
|
151
|
+
|
152
|
+
#### More info
|
153
|
+
|
154
|
+
This section about devise and Omniauth was written with the help of devise documentation.
|
155
|
+
More info about devise and Omniauth on [their documentation](https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview "their documentation").
|
156
|
+
|
157
|
+
## Auth hash
|
158
|
+
|
159
|
+
Here's an example of the auth hash available in request.env['omniauth.auth']:
|
160
|
+
|
161
|
+
```json
|
162
|
+
{
|
163
|
+
"provider": "marvin",
|
164
|
+
"uid": 12345,
|
165
|
+
"info": {
|
166
|
+
"name": "Samy KACIMI",
|
167
|
+
"email": "skacimi@student.42.fr",
|
168
|
+
"nickname": "skacimi",
|
169
|
+
"location": null,
|
170
|
+
"image": "https://cdn.42.fr/userprofil/profilview/skacimi.jpg",
|
171
|
+
"phone": null,
|
172
|
+
"urls": {
|
173
|
+
"Profile": "https://api.intrav2.42.fr/v2/users/skacimi"
|
174
|
+
}
|
175
|
+
},
|
176
|
+
"credentials": {
|
177
|
+
"token": "a1b2c3d4e5f6...",
|
178
|
+
"expires_at": 1443035254,
|
179
|
+
"expires": true
|
180
|
+
},
|
181
|
+
"extra": {
|
182
|
+
"raw_info": {
|
183
|
+
"id": 12345,
|
184
|
+
"alias": [
|
185
|
+
"samy.kacimi@student.42.fr",
|
186
|
+
"kacimi.samy@student.42.fr",
|
187
|
+
"skacimi@student.42.fr"
|
188
|
+
],
|
189
|
+
"email": "skacimi@student.42.fr",
|
190
|
+
"login": "skacimi",
|
191
|
+
"url": "https://api.intrav2.42.fr/v2/users/skacimi",
|
192
|
+
"mobile": null,
|
193
|
+
"displayname": "Samy KACIMI",
|
194
|
+
"image_url": "https://cdn.42.fr/userprofil/profilview/skacimi.jpg",
|
195
|
+
"staff?": false,
|
196
|
+
"correction_point": 7,
|
197
|
+
"location": null,
|
198
|
+
"campus": {
|
199
|
+
"id": 1,
|
200
|
+
"name": "Paris",
|
201
|
+
"created_at": "2015-05-19T12:53:31.459+02:00",
|
202
|
+
"updated_at": "2015-07-20T19:28:05.730+02:00",
|
203
|
+
"time_zone": "Paris",
|
204
|
+
"language_id": 1,
|
205
|
+
"slug": "paris"
|
206
|
+
},
|
207
|
+
"wallet": 70,
|
208
|
+
"groups": [
|
209
|
+
|
210
|
+
],
|
211
|
+
"cursus": {
|
212
|
+
"cursus": {
|
213
|
+
"id": 1,
|
214
|
+
"name": "42",
|
215
|
+
"created_at": "2014-11-02T17:43:38.480+01:00",
|
216
|
+
"updated_at": "2015-07-21T14:31:01.625+02:00",
|
217
|
+
"slug": "42"
|
218
|
+
},
|
219
|
+
"end_at": null,
|
220
|
+
"level": 7.15,
|
221
|
+
"grade": "Midshipman",
|
222
|
+
"projects": [
|
223
|
+
{
|
224
|
+
"name": "Introduction to Wordpress",
|
225
|
+
"id": 14,
|
226
|
+
"slug": "rushes-introduction-to-wordpress",
|
227
|
+
"final_mark": 84,
|
228
|
+
"occurrence": 0,
|
229
|
+
"retriable_at": null,
|
230
|
+
"teams_ids": [
|
231
|
+
4017
|
232
|
+
]
|
233
|
+
},
|
234
|
+
{
|
235
|
+
"name": "Push_swap",
|
236
|
+
"id": 27,
|
237
|
+
"slug": "push_swap",
|
238
|
+
"final_mark": 84,
|
239
|
+
"occurrence": 1,
|
240
|
+
"retriable_at": "2015-03-24T20:13:00.000+01:00",
|
241
|
+
"teams_ids": [
|
242
|
+
55646,
|
243
|
+
60613
|
244
|
+
]
|
245
|
+
},
|
246
|
+
{
|
247
|
+
"name": "Piscine PHP",
|
248
|
+
"id": 48,
|
249
|
+
"slug": "piscine-php",
|
250
|
+
"final_mark": 81,
|
251
|
+
"occurrence": 0,
|
252
|
+
"retriable_at": "2015-03-30T17:40:57.000+02:00",
|
253
|
+
"teams_ids": [
|
254
|
+
64600
|
255
|
+
]
|
256
|
+
},
|
257
|
+
{
|
258
|
+
"name": "D06",
|
259
|
+
"id": 55,
|
260
|
+
"slug": "piscine-php-d06",
|
261
|
+
"final_mark": 13,
|
262
|
+
"occurrence": 0,
|
263
|
+
"retriable_at": "2015-03-30T17:41:30.000+02:00",
|
264
|
+
"teams_ids": [
|
265
|
+
64607
|
266
|
+
]
|
267
|
+
},
|
268
|
+
{
|
269
|
+
"name": "Wolf3d",
|
270
|
+
"id": 8,
|
271
|
+
"slug": "wolf3d",
|
272
|
+
"final_mark": 91,
|
273
|
+
"occurrence": 0,
|
274
|
+
"retriable_at": "2015-04-04T11:57:10.000+02:00",
|
275
|
+
"teams_ids": [
|
276
|
+
53923
|
277
|
+
]
|
278
|
+
},
|
279
|
+
{
|
280
|
+
"name": "D09",
|
281
|
+
"id": 58,
|
282
|
+
"slug": "piscine-php-d09",
|
283
|
+
"final_mark": 58,
|
284
|
+
"occurrence": 0,
|
285
|
+
"retriable_at": "2015-03-30T17:42:10.000+02:00",
|
286
|
+
"teams_ids": [
|
287
|
+
64610
|
288
|
+
]
|
289
|
+
},
|
290
|
+
{
|
291
|
+
"name": "Libft",
|
292
|
+
"id": 1,
|
293
|
+
"slug": "libft",
|
294
|
+
"final_mark": 103,
|
295
|
+
"occurrence": 2,
|
296
|
+
"retriable_at": "2015-01-29T14:55:48.000+01:00",
|
297
|
+
"teams_ids": [
|
298
|
+
117,
|
299
|
+
6157,
|
300
|
+
54350
|
301
|
+
]
|
302
|
+
},
|
303
|
+
{
|
304
|
+
"name": "Fract'ol",
|
305
|
+
"id": 15,
|
306
|
+
"slug": "fract-ol",
|
307
|
+
"final_mark": 102,
|
308
|
+
"occurrence": 0,
|
309
|
+
"retriable_at": "2015-04-02T14:11:59.000+02:00",
|
310
|
+
"teams_ids": [
|
311
|
+
60569
|
312
|
+
]
|
313
|
+
},
|
314
|
+
{
|
315
|
+
"name": "First Internship",
|
316
|
+
"id": 118,
|
317
|
+
"slug": "first-internship",
|
318
|
+
"final_mark": null,
|
319
|
+
"occurrence": 0,
|
320
|
+
"retriable_at": null,
|
321
|
+
"teams_ids": [
|
322
|
+
84976
|
323
|
+
]
|
324
|
+
},
|
325
|
+
{
|
326
|
+
"name": "LibftASM",
|
327
|
+
"id": 79,
|
328
|
+
"slug": "libftasm",
|
329
|
+
"final_mark": 100,
|
330
|
+
"occurrence": 0,
|
331
|
+
"retriable_at": "2015-03-06T17:03:47.000+01:00",
|
332
|
+
"teams_ids": [
|
333
|
+
57132
|
334
|
+
]
|
335
|
+
},
|
336
|
+
{
|
337
|
+
"name": "C Exam - Beginner",
|
338
|
+
"id": 11,
|
339
|
+
"slug": "c-exam-beginner",
|
340
|
+
"final_mark": 80,
|
341
|
+
"occurrence": 13,
|
342
|
+
"retriable_at": "2015-05-27T18:33:17.000+02:00",
|
343
|
+
"teams_ids": [
|
344
|
+
3107,
|
345
|
+
5187,
|
346
|
+
56010,
|
347
|
+
59778,
|
348
|
+
60718,
|
349
|
+
61716,
|
350
|
+
62922,
|
351
|
+
63373,
|
352
|
+
75451,
|
353
|
+
78206,
|
354
|
+
78665,
|
355
|
+
83011,
|
356
|
+
83635,
|
357
|
+
84658
|
358
|
+
]
|
359
|
+
},
|
360
|
+
{
|
361
|
+
"name": "Duration",
|
362
|
+
"id": 140,
|
363
|
+
"slug": "first-internship-duration",
|
364
|
+
"final_mark": null,
|
365
|
+
"occurrence": 0,
|
366
|
+
"retriable_at": null,
|
367
|
+
"teams_ids": [
|
368
|
+
95077
|
369
|
+
]
|
370
|
+
},
|
371
|
+
{
|
372
|
+
"name": "Introduction to iOS",
|
373
|
+
"id": 18,
|
374
|
+
"slug": "rushes-introduction-to-ios",
|
375
|
+
"final_mark": 84,
|
376
|
+
"occurrence": 0,
|
377
|
+
"retriable_at": "2014-12-28T23:09:51.910+01:00",
|
378
|
+
"teams_ids": [
|
379
|
+
4669
|
380
|
+
]
|
381
|
+
},
|
382
|
+
{
|
383
|
+
"name": "FdF",
|
384
|
+
"id": 4,
|
385
|
+
"slug": "fdf",
|
386
|
+
"final_mark": 103,
|
387
|
+
"occurrence": 0,
|
388
|
+
"retriable_at": "2015-01-05T18:32:46.764+01:00",
|
389
|
+
"teams_ids": [
|
390
|
+
2960
|
391
|
+
]
|
392
|
+
},
|
393
|
+
{
|
394
|
+
"name": "Contract Upload",
|
395
|
+
"id": 119,
|
396
|
+
"slug": "first-internship-contract-upload",
|
397
|
+
"final_mark": 100,
|
398
|
+
"occurrence": 0,
|
399
|
+
"retriable_at": "2015-05-30T13:28:06.000+02:00",
|
400
|
+
"teams_ids": [
|
401
|
+
85014
|
402
|
+
]
|
403
|
+
},
|
404
|
+
{
|
405
|
+
"name": "Rush00",
|
406
|
+
"id": 59,
|
407
|
+
"slug": "piscine-php-rush00",
|
408
|
+
"final_mark": 69,
|
409
|
+
"occurrence": 0,
|
410
|
+
"retriable_at": "2015-04-10T18:55:10.000+02:00",
|
411
|
+
"teams_ids": [
|
412
|
+
76109
|
413
|
+
]
|
414
|
+
},
|
415
|
+
{
|
416
|
+
"name": "Rush01",
|
417
|
+
"id": 60,
|
418
|
+
"slug": "piscine-php-rush01",
|
419
|
+
"final_mark": 0,
|
420
|
+
"occurrence": 0,
|
421
|
+
"retriable_at": "2015-04-16T16:49:32.000+02:00",
|
422
|
+
"teams_ids": [
|
423
|
+
77242
|
424
|
+
]
|
425
|
+
},
|
426
|
+
{
|
427
|
+
"name": "D01",
|
428
|
+
"id": 50,
|
429
|
+
"slug": "piscine-php-d01",
|
430
|
+
"final_mark": 45,
|
431
|
+
"occurrence": 0,
|
432
|
+
"retriable_at": null,
|
433
|
+
"teams_ids": [
|
434
|
+
64602
|
435
|
+
]
|
436
|
+
},
|
437
|
+
{
|
438
|
+
"name": "D07",
|
439
|
+
"id": 56,
|
440
|
+
"slug": "piscine-php-d07",
|
441
|
+
"final_mark": 75,
|
442
|
+
"occurrence": 0,
|
443
|
+
"retriable_at": "2015-03-30T17:42:00.000+02:00",
|
444
|
+
"teams_ids": [
|
445
|
+
64608
|
446
|
+
]
|
447
|
+
},
|
448
|
+
{
|
449
|
+
"name": "D04",
|
450
|
+
"id": 53,
|
451
|
+
"slug": "piscine-php-d04",
|
452
|
+
"final_mark": 100,
|
453
|
+
"occurrence": 0,
|
454
|
+
"retriable_at": null,
|
455
|
+
"teams_ids": [
|
456
|
+
64605
|
457
|
+
]
|
458
|
+
},
|
459
|
+
{
|
460
|
+
"name": "D05",
|
461
|
+
"id": 54,
|
462
|
+
"slug": "piscine-php-d05",
|
463
|
+
"final_mark": 70,
|
464
|
+
"occurrence": 0,
|
465
|
+
"retriable_at": "2015-03-30T17:41:55.000+02:00",
|
466
|
+
"teams_ids": [
|
467
|
+
64606
|
468
|
+
]
|
469
|
+
},
|
470
|
+
{
|
471
|
+
"name": "wong_kar_wai",
|
472
|
+
"id": 93,
|
473
|
+
"slug": "rushes-wong_kar_wai",
|
474
|
+
"final_mark": 0,
|
475
|
+
"occurrence": 0,
|
476
|
+
"retriable_at": null,
|
477
|
+
"teams_ids": [
|
478
|
+
58895
|
479
|
+
]
|
480
|
+
},
|
481
|
+
{
|
482
|
+
"name": "Get_Next_Line",
|
483
|
+
"id": 2,
|
484
|
+
"slug": "get_next_line",
|
485
|
+
"final_mark": 102,
|
486
|
+
"occurrence": 0,
|
487
|
+
"retriable_at": "2014-11-22T18:29:02.195+01:00",
|
488
|
+
"teams_ids": [
|
489
|
+
1241
|
490
|
+
]
|
491
|
+
},
|
492
|
+
{
|
493
|
+
"name": "D08",
|
494
|
+
"id": 57,
|
495
|
+
"slug": "piscine-php-d08",
|
496
|
+
"final_mark": 0,
|
497
|
+
"occurrence": 0,
|
498
|
+
"retriable_at": "2015-03-30T17:41:36.000+02:00",
|
499
|
+
"teams_ids": [
|
500
|
+
64609
|
501
|
+
]
|
502
|
+
},
|
503
|
+
{
|
504
|
+
"name": "ft_ls",
|
505
|
+
"id": 3,
|
506
|
+
"slug": "ft_ls",
|
507
|
+
"final_mark": 0,
|
508
|
+
"occurrence": 0,
|
509
|
+
"retriable_at": "2015-01-17T19:13:33.000+01:00",
|
510
|
+
"teams_ids": [
|
511
|
+
1971
|
512
|
+
]
|
513
|
+
},
|
514
|
+
{
|
515
|
+
"name": "D02",
|
516
|
+
"id": 51,
|
517
|
+
"slug": "piscine-php-d02",
|
518
|
+
"final_mark": 13,
|
519
|
+
"occurrence": 0,
|
520
|
+
"retriable_at": "2015-03-30T17:41:17.000+02:00",
|
521
|
+
"teams_ids": [
|
522
|
+
64603
|
523
|
+
]
|
524
|
+
},
|
525
|
+
{
|
526
|
+
"name": "Rushes",
|
527
|
+
"id": 61,
|
528
|
+
"slug": "rushes",
|
529
|
+
"final_mark": null,
|
530
|
+
"occurrence": 0,
|
531
|
+
"retriable_at": null,
|
532
|
+
"teams_ids": [
|
533
|
+
|
534
|
+
]
|
535
|
+
},
|
536
|
+
{
|
537
|
+
"name": "D03",
|
538
|
+
"id": 52,
|
539
|
+
"slug": "piscine-php-d03",
|
540
|
+
"final_mark": 100,
|
541
|
+
"occurrence": 0,
|
542
|
+
"retriable_at": null,
|
543
|
+
"teams_ids": [
|
544
|
+
64604
|
545
|
+
]
|
546
|
+
},
|
547
|
+
{
|
548
|
+
"name": "Savoir Relier",
|
549
|
+
"id": 96,
|
550
|
+
"slug": "savoir-relier",
|
551
|
+
"final_mark": 100,
|
552
|
+
"occurrence": 0,
|
553
|
+
"retriable_at": null,
|
554
|
+
"teams_ids": [
|
555
|
+
62145
|
556
|
+
]
|
557
|
+
},
|
558
|
+
{
|
559
|
+
"name": "Arkanoid",
|
560
|
+
"id": 141,
|
561
|
+
"slug": "rushes-arkanoid",
|
562
|
+
"final_mark": 0,
|
563
|
+
"occurrence": 0,
|
564
|
+
"retriable_at": null,
|
565
|
+
"teams_ids": [
|
566
|
+
79069
|
567
|
+
]
|
568
|
+
},
|
569
|
+
{
|
570
|
+
"name": "D00",
|
571
|
+
"id": 49,
|
572
|
+
"slug": "piscine-php-d00",
|
573
|
+
"final_mark": 118,
|
574
|
+
"occurrence": 0,
|
575
|
+
"retriable_at": null,
|
576
|
+
"teams_ids": [
|
577
|
+
64601
|
578
|
+
]
|
579
|
+
},
|
580
|
+
{
|
581
|
+
"name": "ft_sh1",
|
582
|
+
"id": 7,
|
583
|
+
"slug": "ft_sh1",
|
584
|
+
"final_mark": 97,
|
585
|
+
"occurrence": 0,
|
586
|
+
"retriable_at": "2015-02-10T16:24:33.000+01:00",
|
587
|
+
"teams_ids": [
|
588
|
+
4776
|
589
|
+
]
|
590
|
+
}
|
591
|
+
],
|
592
|
+
"skills": [
|
593
|
+
{
|
594
|
+
"id": 2,
|
595
|
+
"name": "Imperative programming",
|
596
|
+
"level": 6.39
|
597
|
+
},
|
598
|
+
{
|
599
|
+
"id": 1,
|
600
|
+
"name": "Algorithms & AI",
|
601
|
+
"level": 6.2
|
602
|
+
},
|
603
|
+
{
|
604
|
+
"id": 5,
|
605
|
+
"name": "Graphics",
|
606
|
+
"level": 4.06
|
607
|
+
},
|
608
|
+
{
|
609
|
+
"id": 3,
|
610
|
+
"name": "Rigor",
|
611
|
+
"level": 3.95
|
612
|
+
},
|
613
|
+
{
|
614
|
+
"id": 4,
|
615
|
+
"name": "Unix",
|
616
|
+
"level": 1.8
|
617
|
+
},
|
618
|
+
{
|
619
|
+
"id": 6,
|
620
|
+
"name": "Web",
|
621
|
+
"level": 1.35
|
622
|
+
},
|
623
|
+
{
|
624
|
+
"id": 17,
|
625
|
+
"name": "Object-oriented programming",
|
626
|
+
"level": 0.63
|
627
|
+
},
|
628
|
+
{
|
629
|
+
"id": 14,
|
630
|
+
"name": "Adaptation & creativity",
|
631
|
+
"level": 0.34
|
632
|
+
},
|
633
|
+
{
|
634
|
+
"id": 12,
|
635
|
+
"name": "DB & Data",
|
636
|
+
"level": 0.21
|
637
|
+
},
|
638
|
+
{
|
639
|
+
"id": 10,
|
640
|
+
"name": "Network & system administration",
|
641
|
+
"level": 0.21
|
642
|
+
},
|
643
|
+
{
|
644
|
+
"id": 15,
|
645
|
+
"name": "Technology integration",
|
646
|
+
"level": 0.1
|
647
|
+
}
|
648
|
+
]
|
649
|
+
},
|
650
|
+
"achievements": [
|
651
|
+
{
|
652
|
+
"id": 96,
|
653
|
+
"name": "Love me, I'm famous",
|
654
|
+
"description": "Avoir été upvoté 100 fois sur le forum.",
|
655
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/96/users"
|
656
|
+
},
|
657
|
+
{
|
658
|
+
"id": 95,
|
659
|
+
"name": "Love me, I'm famous",
|
660
|
+
"description": "Avoir été upvoté 42 fois sur le forum.",
|
661
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/95/users"
|
662
|
+
},
|
663
|
+
{
|
664
|
+
"id": 94,
|
665
|
+
"name": "Love me, I'm famous",
|
666
|
+
"description": "Avoir été upvoté 10 fois sur le forum.",
|
667
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/94/users"
|
668
|
+
},
|
669
|
+
{
|
670
|
+
"id": 45,
|
671
|
+
"name": "Home is where the code is",
|
672
|
+
"description": "S'être logué dans le même cluster un mois de suite.",
|
673
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/45/users"
|
674
|
+
},
|
675
|
+
{
|
676
|
+
"id": 41,
|
677
|
+
"name": "In the name of Nicolas",
|
678
|
+
"description": "Etre logué 90h sur une semaine. (à bosser, comme Nicolas vous l'a conseillé !)",
|
679
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/41/users"
|
680
|
+
},
|
681
|
+
{
|
682
|
+
"id": 90,
|
683
|
+
"name": "I post, therefore I am",
|
684
|
+
"description": "Poster 10 messages sur le forum.",
|
685
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/90/users"
|
686
|
+
},
|
687
|
+
{
|
688
|
+
"id": 1,
|
689
|
+
"name": "Welcome, Cadet !",
|
690
|
+
"description": "Tu as réussi ta piscine C. Bienvenue à 42 !",
|
691
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/1/users"
|
692
|
+
},
|
693
|
+
{
|
694
|
+
"id": 57,
|
695
|
+
"name": "Attendee",
|
696
|
+
"description": "Assister à 21 conférences.",
|
697
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/57/users"
|
698
|
+
},
|
699
|
+
{
|
700
|
+
"id": 56,
|
701
|
+
"name": "Attendee",
|
702
|
+
"description": "Assister à 10 conférences.",
|
703
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/56/users"
|
704
|
+
},
|
705
|
+
{
|
706
|
+
"id": 55,
|
707
|
+
"name": "Attendee",
|
708
|
+
"description": "Assister à 3 conférences.",
|
709
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/55/users"
|
710
|
+
},
|
711
|
+
{
|
712
|
+
"id": 54,
|
713
|
+
"name": "Attendee",
|
714
|
+
"description": "Assister à une conférence.",
|
715
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/54/users"
|
716
|
+
},
|
717
|
+
{
|
718
|
+
"id": 84,
|
719
|
+
"name": "I'm reliable !",
|
720
|
+
"description": "Participer à 21 soutenances d'affilée sans en manquer aucune.",
|
721
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/84/users"
|
722
|
+
},
|
723
|
+
{
|
724
|
+
"id": 91,
|
725
|
+
"name": "I post, therefore I am",
|
726
|
+
"description": "Poster 42 messages sur le forum.",
|
727
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/91/users"
|
728
|
+
},
|
729
|
+
{
|
730
|
+
"id": 4,
|
731
|
+
"name": "Code Explorer",
|
732
|
+
"description": "Valider son premier projet.",
|
733
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/4/users"
|
734
|
+
},
|
735
|
+
{
|
736
|
+
"id": 6,
|
737
|
+
"name": "Code Explorer",
|
738
|
+
"description": "Valider 10 projets.",
|
739
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/6/users"
|
740
|
+
},
|
741
|
+
{
|
742
|
+
"id": 5,
|
743
|
+
"name": "Code Explorer",
|
744
|
+
"description": "Valider 3 projets.",
|
745
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/5/users"
|
746
|
+
},
|
747
|
+
{
|
748
|
+
"id": 17,
|
749
|
+
"name": "Bonus Hunter",
|
750
|
+
"description": "Valider 1 projet avec le maximum de bonus.",
|
751
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/17/users"
|
752
|
+
},
|
753
|
+
{
|
754
|
+
"id": 25,
|
755
|
+
"name": "Rigorous Basterd",
|
756
|
+
"description": "Valider 3 projets d'affilée (journées de piscines comprises).",
|
757
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/25/users"
|
758
|
+
},
|
759
|
+
{
|
760
|
+
"id": 48,
|
761
|
+
"name": "Film buff",
|
762
|
+
"description": "Regarder 10 videos sur l'e-learning.",
|
763
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/48/users"
|
764
|
+
},
|
765
|
+
{
|
766
|
+
"id": 82,
|
767
|
+
"name": "I have no idea what I'm doing",
|
768
|
+
"description": "Faire une soutenance sans avoir validé le projet.",
|
769
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/82/users"
|
770
|
+
},
|
771
|
+
{
|
772
|
+
"id": 47,
|
773
|
+
"name": "Film buff",
|
774
|
+
"description": "Regarder 3 videos sur l'e-learning.",
|
775
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/47/users"
|
776
|
+
},
|
777
|
+
{
|
778
|
+
"id": 87,
|
779
|
+
"name": "I post, therefore I am",
|
780
|
+
"description": "Poster 1 message sur le forum.",
|
781
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/87/users"
|
782
|
+
},
|
783
|
+
{
|
784
|
+
"id": 79,
|
785
|
+
"name": "Perfect examiner",
|
786
|
+
"description": "Avoir un feedback correcteur à 100% sur 10 soutenances d'affilée.",
|
787
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/79/users"
|
788
|
+
},
|
789
|
+
{
|
790
|
+
"id": 88,
|
791
|
+
"name": "Love me, I'm famous",
|
792
|
+
"description": "Avoir été upvoté 1 fois sur le forum.",
|
793
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/88/users"
|
794
|
+
},
|
795
|
+
{
|
796
|
+
"id": 50,
|
797
|
+
"name": "Film buff",
|
798
|
+
"description": "Regarder 42 videos sur l'e-learning.",
|
799
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/50/users"
|
800
|
+
},
|
801
|
+
{
|
802
|
+
"id": 49,
|
803
|
+
"name": "Film buff",
|
804
|
+
"description": "Regarder 21 videos sur l'e-learning.",
|
805
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/49/users"
|
806
|
+
},
|
807
|
+
{
|
808
|
+
"id": 78,
|
809
|
+
"name": "Perfect examiner",
|
810
|
+
"description": "Avoir un feedback correcteur à 100% sur 3 soutenances d'affilée.",
|
811
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/78/users"
|
812
|
+
},
|
813
|
+
{
|
814
|
+
"id": 46,
|
815
|
+
"name": "Film buff",
|
816
|
+
"description": "Regarder 1 video sur l'e-learning.",
|
817
|
+
"users_url": "https://api.intrav2.42.fr/v2/achievements/46/users"
|
818
|
+
}
|
819
|
+
],
|
820
|
+
"titles": [
|
821
|
+
|
822
|
+
]
|
823
|
+
}
|
824
|
+
}
|
825
|
+
}
|
826
|
+
```
|
827
|
+
|
828
|
+
## Licence
|
829
|
+
|
830
|
+
The MIT License (MIT)
|
831
|
+
|
832
|
+
Copyright (c) 2015 Samy KACIMI
|
833
|
+
|
834
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
835
|
+
of this software and associated documentation files (the "Software"), to deal
|
836
|
+
in the Software without restriction, including without limitation the rights
|
837
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
838
|
+
copies of the Software, and to permit persons to whom the Software is
|
839
|
+
furnished to do so, subject to the following conditions:
|
840
|
+
|
841
|
+
The above copyright notice and this permission notice shall be included in
|
842
|
+
all copies or substantial portions of the Software.
|
843
|
+
|
844
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
845
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
846
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
847
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
848
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
849
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
850
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "omniauth/marvin"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "omniauth/marvin"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "omniauth/strategies/oauth2"
|
2
|
+
|
3
|
+
module OmniAuth
|
4
|
+
module Strategies
|
5
|
+
class Marvin < OmniAuth::Strategies::OAuth2
|
6
|
+
option :name, "marvin"
|
7
|
+
|
8
|
+
option :client_options, {
|
9
|
+
site: "https://api.intrav2.42.fr",
|
10
|
+
authorize_path: "v2/oauth/authorize"
|
11
|
+
}
|
12
|
+
|
13
|
+
uid { raw_info['id'] }
|
14
|
+
|
15
|
+
info do
|
16
|
+
{
|
17
|
+
name: raw_info["displayname"],
|
18
|
+
email: raw_info["email"],
|
19
|
+
nickname: raw_info["login"],
|
20
|
+
location: raw_info["location"],
|
21
|
+
image: raw_info["image_url"],
|
22
|
+
phone: raw_info["mobile"],
|
23
|
+
urls: {
|
24
|
+
"Profile" => raw_info["url"]
|
25
|
+
}
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
extra do
|
30
|
+
{
|
31
|
+
'raw_info' => raw_info
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def raw_info
|
36
|
+
@raw_info ||= access_token.get('v2/me').parsed
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'omniauth/marvin/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "omniauth-marvin"
|
8
|
+
spec.version = Omniauth::Marvin::VERSION
|
9
|
+
spec.authors = ["Samy KACIMI"]
|
10
|
+
spec.email = ["samy.kacimi@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{OmniAuth OAuth2 strategy for 42 School}
|
13
|
+
spec.description = %q{This gem is an OmniAuth OAuth2 strategy for 42 School. 42 Students can use it to signup/login on their apps.}
|
14
|
+
spec.homepage = "https://github.com/fakenine/omniauth-marvin"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
|
+
# delete this section to allow pushing this gem to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
21
|
+
else
|
22
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
+
spec.bindir = "exe"
|
27
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ["lib"]
|
29
|
+
|
30
|
+
spec.add_runtime_dependency 'omniauth-oauth2', '~> 1.2'
|
31
|
+
spec.add_runtime_dependency 'multi_json', '~> 1.3'
|
32
|
+
|
33
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: omniauth-marvin
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Samy KACIMI
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: omniauth-oauth2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: multi_json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.10'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.10'
|
55
|
+
description: This gem is an OmniAuth OAuth2 strategy for 42 School. 42 Students can
|
56
|
+
use it to signup/login on their apps.
|
57
|
+
email:
|
58
|
+
- samy.kacimi@gmail.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- ".rspec"
|
65
|
+
- ".travis.yml"
|
66
|
+
- Gemfile
|
67
|
+
- LICENSE.txt
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- bin/console
|
71
|
+
- bin/setup
|
72
|
+
- lib/omniauth-marvin.rb
|
73
|
+
- lib/omniauth/marvin.rb
|
74
|
+
- lib/omniauth/marvin/version.rb
|
75
|
+
- lib/omniauth/strategies/marvin.rb
|
76
|
+
- omniauth-marvin.gemspec
|
77
|
+
homepage: https://github.com/fakenine/omniauth-marvin
|
78
|
+
licenses:
|
79
|
+
- MIT
|
80
|
+
metadata:
|
81
|
+
allowed_push_host: https://rubygems.org
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.4.8
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: OmniAuth OAuth2 strategy for 42 School
|
102
|
+
test_files: []
|