solidus_social 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.hound.yml +26 -0
- data/.rspec +3 -0
- data/.rubocop.yml +8 -0
- data/.travis.yml +19 -0
- data/CHANGELOG.md +5 -0
- data/CONTRIBUTING.md +31 -0
- data/Gemfile +7 -0
- data/Guardfile +10 -0
- data/LICENSE.md +26 -0
- data/README.md +148 -0
- data/Rakefile +15 -0
- data/app/assets/javascripts/spree/backend/solidus_social.js +1 -0
- data/app/assets/javascripts/spree/frontend/solidus_social.js +1 -0
- data/app/assets/stylesheets/spree/backend/solidus_social.css +3 -0
- data/app/assets/stylesheets/spree/frontend/fontello.css +64 -0
- data/app/assets/stylesheets/spree/frontend/solidus_social.css +4 -0
- data/app/controllers/spree/admin/authentication_methods_controller.rb +18 -0
- data/app/controllers/spree/omniauth_callbacks_controller.rb +67 -0
- data/app/controllers/spree/user_authentications_controller.rb +12 -0
- data/app/controllers/spree/user_registrations_controller_decorator.rb +15 -0
- data/app/helpers/spree/omniauth_callbacks_helper.rb +5 -0
- data/app/models/spree/authentication_method.rb +13 -0
- data/app/models/spree/social_configuration.rb +5 -0
- data/app/models/spree/user_authentication.rb +3 -0
- data/app/models/spree/user_decorator.rb +16 -0
- data/app/overrides/add_authentications_to_account_summary.rb +5 -0
- data/app/overrides/admin_configuration_decorator.rb +5 -0
- data/app/overrides/user_registrations_decorator.rb +17 -0
- data/app/views/spree/admin/authentication_methods/_form.html.erb +45 -0
- data/app/views/spree/admin/authentication_methods/edit.html.erb +18 -0
- data/app/views/spree/admin/authentication_methods/index.html.erb +54 -0
- data/app/views/spree/admin/authentication_methods/new.html.erb +18 -0
- data/app/views/spree/admin/shared/_configurations_menu.html.erb +4 -0
- data/app/views/spree/shared/_social.html.erb +11 -0
- data/app/views/spree/shared/_user_form.html.erb +19 -0
- data/app/views/spree/users/_new-customer.html.erb +5 -0
- data/app/views/spree/users/_social.html.erb +28 -0
- data/bin/rails +7 -0
- data/config/initializers/devise.rb +13 -0
- data/config/locales/de.yml +26 -0
- data/config/locales/en.yml +26 -0
- data/config/locales/es-MX.yml +26 -0
- data/config/locales/fr.yml +26 -0
- data/config/locales/nl.yml +26 -0
- data/config/locales/pt-BR.yml +26 -0
- data/config/locales/sv.yml +26 -0
- data/config/routes.rb +14 -0
- data/db/migrate/20120120163432_create_user_authentications.rb +10 -0
- data/db/migrate/20120123163222_create_authentication_methods.rb +13 -0
- data/lib/generators/solidus_social/install/install_generator.rb +24 -0
- data/lib/solidus_social.rb +10 -0
- data/lib/solidus_social/engine.rb +70 -0
- data/lib/solidus_social/version.rb +18 -0
- data/solidus_social.gemspec +47 -0
- data/spec/controllers/spree/omniauth_callbacks_controller_spec.rb +160 -0
- data/spec/features/spree/admin/authentication_methods_configuration_spec.rb +79 -0
- data/spec/features/spree/sign_in_spec.rb +81 -0
- data/spec/lib/spree_social/engine_spec.rb +16 -0
- data/spec/models/spree/user_decorator_spec.rb +54 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/support/capybara.rb +18 -0
- data/spec/support/database_cleaner.rb +24 -0
- data/spec/support/devise.rb +3 -0
- data/spec/support/factory_girl.rb +7 -0
- data/spec/support/spree.rb +8 -0
- metadata +429 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3fe49d36ea644340c59c66b5e8506ab57a466f6c
|
4
|
+
data.tar.gz: d42af370d565407ebdbccbe60d32fbcbef814478
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 836eb284a9553b79eec6a3738a50cb30cb37162dad469fccee63ec153b4b7c888268d8beae8564a47efae281811c0f14f9ebf1f5f72136092eb32655428f4b79
|
7
|
+
data.tar.gz: 9b458f66b04f4ab4be83f0d4c151f5096cce9ff51790a2b9de95bba362e14e602d3fd392ae817491970ca4a6bd6cc55eb4c9eb30e788a615b566632ccd9e11b1
|
data/.gitignore
ADDED
data/.hound.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
# Too picky.
|
3
|
+
LineLength:
|
4
|
+
Enabled: false
|
5
|
+
|
6
|
+
# This should truly be on for well documented gems.
|
7
|
+
Documentation:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
# Neatly aligned code is too swell.
|
11
|
+
SingleSpaceBeforeFirstArg:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
# Don't mess with RSpec DSL.
|
15
|
+
Blocks:
|
16
|
+
Exclude:
|
17
|
+
- 'spec/**/*'
|
18
|
+
|
19
|
+
# We really like the readability with newline in beginning of classes.
|
20
|
+
EmptyLinesAroundBlockBody:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
# Use nested module/class definitions instead of compact style.
|
24
|
+
# Too high git impact to change this now.
|
25
|
+
ClassAndModuleChildren:
|
26
|
+
Enabled: false
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
---
|
2
|
+
language: ruby
|
3
|
+
rvm:
|
4
|
+
- 2.1
|
5
|
+
- 2.2
|
6
|
+
- '2.3.0'
|
7
|
+
env:
|
8
|
+
matrix:
|
9
|
+
- SOLIDUS_BRANCH=master
|
10
|
+
- SOLIDUS_BRANCH=v1.2
|
11
|
+
- SOLIDUS_BRANCH=v1.1
|
12
|
+
- SOLIDUS_BRANCH=v1.0
|
13
|
+
sudo: false
|
14
|
+
before_script:
|
15
|
+
- sh -e /etc/init.d/xvfb start
|
16
|
+
- export DISPLAY=:99.0
|
17
|
+
- bundle exec rake test_app
|
18
|
+
script:
|
19
|
+
- bundle exec rspec spec
|
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
In the spirit of [free software][1], **everyone** is encouraged to help improve this project.
|
4
|
+
|
5
|
+
Here are some ways *you* can contribute:
|
6
|
+
|
7
|
+
* by using prerelease versions
|
8
|
+
* by reporting [bugs][2]
|
9
|
+
* by suggesting new features
|
10
|
+
* by writing [translations][3]
|
11
|
+
* by writing or editing documentation
|
12
|
+
* by writing specifications
|
13
|
+
* by writing code (*no patch is too small*: fix typos, add comments, clean up inconsistent whitespace)
|
14
|
+
* by refactoring code
|
15
|
+
* by resolving [issues][2]
|
16
|
+
* by reviewing patches
|
17
|
+
|
18
|
+
Starting point:
|
19
|
+
|
20
|
+
* Fork the repo
|
21
|
+
* Clone your repo
|
22
|
+
* Run `bundle install`
|
23
|
+
* Run `bundle exec rake test_app` to create the test application in `spec/test_app`
|
24
|
+
* Make your changes
|
25
|
+
* Ensure specs pass by running `bundle exec rspec spec`
|
26
|
+
* Ensure code style by running `rubocop .`
|
27
|
+
* Submit your pull request
|
28
|
+
|
29
|
+
[1]: http://www.fsf.org/licensing/essays/free-sw.html
|
30
|
+
[2]: https://github.com/solidusio-contrib/solidus_social/issues
|
31
|
+
[3]: https://github.com/solidusio-contrib/solidus_social/blob/master/config/locales
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
guard 'rspec', cmd: 'bundle exec rspec' do
|
2
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
3
|
+
watch('config/routes.rb') { 'spec/controllers' }
|
4
|
+
watch(%r{^spec/(.+)_spec\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
5
|
+
watch(%r{^app/(.+)_decorator\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
6
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
watch(%r{^app/(.*)(\.erb)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
8
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
9
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb" }
|
10
|
+
end
|
data/LICENSE.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2014 John Dyer and other contributors
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name Spree nor the names of its contributors may be used to
|
13
|
+
endorse or promote products derived from this software without specific
|
14
|
+
prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
# Solidus Social
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/solidusio-contrib/solidus_social.svg?branch=master)](https://travis-ci.org/solidusio-contrib/solidus_social)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/solidusio-contrib/solidus_social/badges/gpa.svg)](https://codeclimate.com/github/solidusio-contrib/solidus_social)
|
5
|
+
|
6
|
+
Core for all social media related functionality for Solidus.
|
7
|
+
The Solidus Social gem handles authorization, account creation and association through social media sources such as Twitter and Facebook.
|
8
|
+
This gem is beta at best and should be treated as such.
|
9
|
+
Features and code base will change rapidly as this is under active development.
|
10
|
+
Use with caution.
|
11
|
+
|
12
|
+
---
|
13
|
+
|
14
|
+
## Setup for Production
|
15
|
+
|
16
|
+
Add this extension to your `Gemfile`:
|
17
|
+
```ruby
|
18
|
+
gem 'solidus_social'
|
19
|
+
```
|
20
|
+
|
21
|
+
Then run:
|
22
|
+
```sh
|
23
|
+
$ bundle && bundle exec rails g solidus_social:install
|
24
|
+
$ bundle exec rake db:migrate
|
25
|
+
```
|
26
|
+
|
27
|
+
Preference(optional): By default url will be '/users/auth/:provider'. If you wish to modify the url to: '/member/auth/:provider', '/profile/auth/:provider', or '/auth/:provider' then you can do this accordingly in your **config/initializers/spree.rb** file as described below -
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Spree::SocialConfig[:path_prefix] = 'member' # for /member/auth/:provider
|
31
|
+
Spree::SocialConfig[:path_prefix] = 'profile' # for /profile/auth/:provider
|
32
|
+
Spree::SocialConfig[:path_prefix] = '' # for /auth/:provider
|
33
|
+
```
|
34
|
+
|
35
|
+
---
|
36
|
+
|
37
|
+
## Spree Setup to Utilize OAuth Sources
|
38
|
+
|
39
|
+
Login as an admin user and navigate to Configuration > Social Authentication Methods
|
40
|
+
|
41
|
+
Click on the New Authentication Method button to enter the key obtained from their respective source, (See below for instructions on setting up the various providers).
|
42
|
+
|
43
|
+
Multiple key entries can now be entered based on the rails environment. This allows for portability and the lack of need to check in your key to your repository. You also have the ability to enable and disable sources. These setting will be reflected on the client UI as well.
|
44
|
+
|
45
|
+
Alternatively you can ship keys as environment variables and create these Authentication Method records on application boot via an initializer. Below is an example for facebook.
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
# Ensure our environment is bootstrapped with a facebook connect app
|
49
|
+
if ActiveRecord::Base.connection.table_exists? 'spree_authentication_methods'
|
50
|
+
Spree::AuthenticationMethod.where(environment: Rails.env, provider: 'facebook').first_or_create do |auth_method|
|
51
|
+
auth_method.api_key = ENV['FACEBOOK_APP_ID']
|
52
|
+
auth_method.api_secret = ENV['FACEBOOK_APP_SECRET']
|
53
|
+
auth_method.active = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
**You MUST restart your application after configuring or updating an authentication method.**
|
59
|
+
|
60
|
+
---
|
61
|
+
|
62
|
+
## Setup the Applications at the Respective Sources
|
63
|
+
|
64
|
+
OAuth Applications @ Facebook, Twitter and / or Github are supported out of the box but you will need to setup applications are each respective site as follows for public use and for development.
|
65
|
+
|
66
|
+
> All URLs must be in the form of domain.tld you may add a port as well for development
|
67
|
+
|
68
|
+
### Facebook
|
69
|
+
|
70
|
+
[Facebook / Developers / Apps][2]
|
71
|
+
|
72
|
+
1. Name the app what you will and agree to the terms.
|
73
|
+
2. Fill out the capcha
|
74
|
+
3. Under the Web Site tab
|
75
|
+
4. Site URL: http://your_computer.local:3000 for development / http://your-site.com for production
|
76
|
+
5. Site domain: your-computer.local / your-site.com respectively
|
77
|
+
|
78
|
+
### Twitter
|
79
|
+
|
80
|
+
[Twitter / Application Management / Create an application][3]
|
81
|
+
|
82
|
+
1. Name and Description must be filled in with something
|
83
|
+
2. Application Website: http://your_computer.local:3000 for development / http://your-site.com for production
|
84
|
+
3. Application Type: Browser
|
85
|
+
4. Callback URL: http://your_computer.local:3000 for development / http://your-site.com for production
|
86
|
+
5. Default Access Type: Read & Write
|
87
|
+
6. Save Application
|
88
|
+
|
89
|
+
### Github
|
90
|
+
|
91
|
+
[Github / Applications / Register a new OAuth application][4]
|
92
|
+
|
93
|
+
1. Name The Application
|
94
|
+
2. Main URL: http://your_computer.local:3000 for development / http://your-site.com for production
|
95
|
+
3. Callback URL: http://your_computer.local:3000 for development / http://your-site.com for production
|
96
|
+
4. Click Create
|
97
|
+
|
98
|
+
> This does not seem to be a listed Github item right now. To View and / or edit your applications goto [http://github.com/account/applications](http://github.com/account/applications)
|
99
|
+
|
100
|
+
### Amazon
|
101
|
+
|
102
|
+
[Amazon / App Console / Register a new OAuth application][10]
|
103
|
+
|
104
|
+
1. Register New Application
|
105
|
+
2. Name the Application, provide description and URL for Privacy Policy
|
106
|
+
3. Click Save
|
107
|
+
4. Add Your site under Web Settings > Allowed Return URLs (example: http://localhost:3000/users/auth/amazon/callback)
|
108
|
+
|
109
|
+
> The app console is available at [https://login.amazon.com/manageApps](https://login.amazon.com/manageApps)
|
110
|
+
|
111
|
+
### Other OAuth sources that are currently supported
|
112
|
+
|
113
|
+
* Google (OAuth)
|
114
|
+
|
115
|
+
## Adding other OAuth sources
|
116
|
+
|
117
|
+
It is easy to add any OAuth source, given there is an OmniAuth strategy gem for it (and if not, you can easily [write one by yourself](https://github.com/intridea/omniauth/wiki/Strategy-Contribution-Guide). For instance, if you want to add authorization via LinkedIn, the steps will be:
|
118
|
+
|
119
|
+
1. Add `gem "omniauth-linkedin"` to your Gemfile, run `bundle install`.
|
120
|
+
2. In an initializer file, e.g. `config/initializers/devise.rb`, add and init a new provider for SolidusSocial:
|
121
|
+
|
122
|
+
SolidusSocial::OAUTH_PROVIDERS << ['LinkedIn', 'linkedin']
|
123
|
+
SolidusSocial.init_provider('linkedin')
|
124
|
+
|
125
|
+
3. Activate your provider as usual (via initializer or admin interface).
|
126
|
+
4. Override `spree/users/social` view to render OAuth links in preferred way for a new one to be displayed. Or alternatively, include to your CSS a definition for `.icon-spree-linkedin-circled` and an embedded icon font for LinkedIn from [fontello.com](http://fontello.com/) (the way existing icons for Facebook, Twitter, etc are implemented). You can also override CSS classes for other providers, `.icon-spree-<provider>-circled`, to use different font icons or classic background images, without having to override views.
|
127
|
+
|
128
|
+
---
|
129
|
+
|
130
|
+
## Contributing
|
131
|
+
|
132
|
+
See corresponding [guidelines][11].
|
133
|
+
|
134
|
+
---
|
135
|
+
|
136
|
+
Copyright (c) 2014 [John Dyer][7] and [contributors][8], released under the [New BSD License][9]
|
137
|
+
|
138
|
+
[1]: https://github.com/spree/spree
|
139
|
+
[2]: https://developers.facebook.com/apps/?action=create
|
140
|
+
[3]: https://apps.twitter.com/app/new
|
141
|
+
[4]: https://github.com/settings/applications/new
|
142
|
+
[5]: http://www.fsf.org/licensing/essays/free-sw.html
|
143
|
+
[6]: https://github.com/solidusio-contrib/solidus_social/issues
|
144
|
+
[7]: https://github.com/LBRapid
|
145
|
+
[8]: https://github.com/solidusio-contrib/solidus_social/graphs/contributors
|
146
|
+
[9]: https://github.com/solidusio-contrib/solidus_social/blob/master/LICENSE.md
|
147
|
+
[10]: https://login.amazon.com/manageApps
|
148
|
+
[11]: https://github.com/solidusio-contrib/solidus_social/blob/master/CONTRIBUTING.md
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'spree/testing_support/common_rake'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task default: :spec
|
10
|
+
|
11
|
+
desc 'Generates a dummy app for testing'
|
12
|
+
task :test_app do
|
13
|
+
ENV['LIB_NAME'] = 'solidus_social'
|
14
|
+
Rake::Task['common:test_app'].invoke('Spree::User')
|
15
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require spree/backend
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require spree/frontend
|
@@ -0,0 +1,64 @@
|
|
1
|
+
/**
|
2
|
+
* Generated from fontello.com
|
3
|
+
* Using Entypo fonts by Daniel Bruce
|
4
|
+
* Licenced under CC BY-SA
|
5
|
+
*
|
6
|
+
* Using embedded fonts for minimal approach.
|
7
|
+
* Tweaked icon names to avoid collision.
|
8
|
+
* Set 280% font size below per default.
|
9
|
+
*
|
10
|
+
* Only includes normal and circle icons for:
|
11
|
+
* - Facebook
|
12
|
+
* - Github
|
13
|
+
* - Google+ for Google Oauth2
|
14
|
+
* - Twitter
|
15
|
+
* - Amazon
|
16
|
+
*/
|
17
|
+
|
18
|
+
@font-face {
|
19
|
+
font-family: 'fontello';
|
20
|
+
src: url('data:application/octet-stream;base64,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') format('woff'),
|
21
|
+
url('data:application/octet-stream;base64,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') format('truetype');
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
[class^="icon-spree-"]:before, [class*=" icon-spree-"]:before {
|
26
|
+
font-family: "fontello";
|
27
|
+
font-style: normal;
|
28
|
+
font-weight: normal;
|
29
|
+
speak: none;
|
30
|
+
|
31
|
+
display: inline-block;
|
32
|
+
text-decoration: inherit;
|
33
|
+
width: 1em;
|
34
|
+
margin-right: .2em;
|
35
|
+
text-align: center;
|
36
|
+
/* opacity: .8; */
|
37
|
+
|
38
|
+
/* For safety - reset parent styles, that can break glyph codes*/
|
39
|
+
font-variant: normal;
|
40
|
+
text-transform: none;
|
41
|
+
|
42
|
+
/* fix buttons height, for twitter bootstrap */
|
43
|
+
line-height: 1em;
|
44
|
+
|
45
|
+
/* Animation center compensation - margins should be symmetric */
|
46
|
+
/* remove if not needed */
|
47
|
+
margin-left: .2em;
|
48
|
+
|
49
|
+
/* you can be more comfortable with increased icons size */
|
50
|
+
font-size: 280%;
|
51
|
+
|
52
|
+
/* Uncomment for 3D effect */
|
53
|
+
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
|
54
|
+
}
|
55
|
+
.icon-spree-github:before { content: '\e800'; } /* '' */
|
56
|
+
.icon-spree-github-circled:before { content: '\e801'; } /* '' */
|
57
|
+
.icon-spree-twitter:before { content: '\e802'; } /* '' */
|
58
|
+
.icon-spree-twitter-circled:before { content: '\e803'; } /* '' */
|
59
|
+
.icon-spree-facebook:before { content: '\e804'; } /* '' */
|
60
|
+
.icon-spree-facebook-circled:before { content: '\e805'; } /* '' */
|
61
|
+
.icon-spree-google-oauth2:before { content: '\e806'; } /* '' */
|
62
|
+
.icon-spree-google-oauth2-circled:before { content: '\e807'; } /* '' */
|
63
|
+
.icon-spree-amazon:before { content: '\e808'; } /* '' */
|
64
|
+
.icon-spree-amazon-circled:before { content: '\e808'; } /* '' */
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class AuthenticationMethodsController < ResourceController
|
4
|
+
create.after :update_oauth_method
|
5
|
+
update.after :update_oauth_method
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def update_oauth_method
|
10
|
+
auth_method = params[:authentication_method]
|
11
|
+
return unless auth_method[:active] == 'true' && auth_method[:environment] == ::Rails.env
|
12
|
+
Devise.setup do |config|
|
13
|
+
config.omniauth auth_method[:provider], auth_method[:api_key], auth_method[:api_secret]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class Spree::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
2
|
+
include Spree::Core::ControllerHelpers::Common
|
3
|
+
include Spree::Core::ControllerHelpers::Order
|
4
|
+
include Spree::Core::ControllerHelpers::Auth
|
5
|
+
include Spree::Core::ControllerHelpers::Store
|
6
|
+
|
7
|
+
def self.provides_callback_for(*providers)
|
8
|
+
providers.each do |provider|
|
9
|
+
class_eval <<-FUNCTION_DEFS, __FILE__, __LINE__ + 1
|
10
|
+
def #{provider}
|
11
|
+
if request.env['omniauth.error'].present?
|
12
|
+
flash[:error] = I18n.t('devise.omniauth_callbacks.failure', kind: auth_hash['provider'], reason: Spree.t(:user_was_not_valid))
|
13
|
+
redirect_back_or_default(root_url)
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
authentication = Spree::UserAuthentication.find_by_provider_and_uid(auth_hash['provider'], auth_hash['uid'])
|
18
|
+
|
19
|
+
if authentication.present? and authentication.try(:user).present?
|
20
|
+
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
|
21
|
+
sign_in_and_redirect :spree_user, authentication.user
|
22
|
+
elsif spree_current_user
|
23
|
+
spree_current_user.apply_omniauth(auth_hash)
|
24
|
+
spree_current_user.save!
|
25
|
+
flash[:notice] = I18n.t('devise.sessions.signed_in')
|
26
|
+
redirect_back_or_default(account_url)
|
27
|
+
else
|
28
|
+
user = Spree::User.find_by_email(auth_hash['info']['email']) || Spree::User.new
|
29
|
+
user.apply_omniauth(auth_hash)
|
30
|
+
if user.save
|
31
|
+
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
|
32
|
+
sign_in_and_redirect :spree_user, user
|
33
|
+
else
|
34
|
+
session[:omniauth] = auth_hash.except('extra')
|
35
|
+
flash[:notice] = Spree.t(:one_more_step, kind: auth_hash['provider'].capitalize)
|
36
|
+
redirect_to new_spree_user_registration_url
|
37
|
+
return
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
if current_order
|
42
|
+
user = spree_current_user || authentication.user
|
43
|
+
current_order.associate_user!(user)
|
44
|
+
session[:guest_token] = nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
FUNCTION_DEFS
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
SolidusSocial::OAUTH_PROVIDERS.each do |provider|
|
52
|
+
provides_callback_for provider[1].to_sym
|
53
|
+
end
|
54
|
+
|
55
|
+
def failure
|
56
|
+
set_flash_message :alert, :failure, kind: failed_strategy.name.to_s.humanize, reason: failure_message
|
57
|
+
redirect_to spree.login_path
|
58
|
+
end
|
59
|
+
|
60
|
+
def passthru
|
61
|
+
render file: "#{Rails.root}/public/404", formats: [:html], status: 404, layout: false
|
62
|
+
end
|
63
|
+
|
64
|
+
def auth_hash
|
65
|
+
request.env['omniauth.auth']
|
66
|
+
end
|
67
|
+
end
|