Skip to content

Commit ae4141e

Browse files
sho ishiharajoshbuker
authored andcommitted
Support the LINE login auth (#80)
* line provider * require line provider * spec * fix response params * set state * fix spec
1 parent ae02d2e commit ae4141e

File tree

6 files changed

+84
-1
lines changed

6 files changed

+84
-1
lines changed

lib/generators/sorcery/templates/initializer.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777

7878
# -- external --
7979
# What providers are supported by this app
80-
# i.e. [:twitter, :facebook, :github, :linkedin, :xing, :google, :liveid, :salesforce, :slack].
80+
# i.e. [:twitter, :facebook, :github, :linkedin, :xing, :google, :liveid, :salesforce, :slack, :line].
8181
# Default: `[]`
8282
#
8383
# config.external_providers =
@@ -216,6 +216,10 @@
216216
# config.salesforce.scope = "full"
217217
# config.salesforce.user_info_mapping = {:email => "email"}
218218

219+
# config.line.key = ""
220+
# config.line.secret = ""
221+
# config.line.callback_url = "http://mydomain.com:3000/oauth/callback?provider=line"
222+
219223
# --- user config ---
220224
config.user_config do |user|
221225
# -- core --

lib/sorcery/controller/submodules/external.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def self.included(base)
2525
require 'sorcery/providers/microsoft'
2626
require 'sorcery/providers/instagram'
2727
require 'sorcery/providers/auth0'
28+
require 'sorcery/providers/line'
2829

2930
Config.module_eval do
3031
class << self

lib/sorcery/providers/line.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
module Sorcery
2+
module Providers
3+
# This class adds support for OAuth with line.com.
4+
#
5+
# config.line.key = <key>
6+
# config.line.secret = <secret>
7+
# ...
8+
#
9+
class Line < Base
10+
include Protocols::Oauth2
11+
12+
attr_accessor :token_url, :user_info_path, :auth_path
13+
14+
def initialize
15+
super
16+
17+
@site = 'https://access.line.me'
18+
@user_info_path = 'https://api.line.me/v2/profile'
19+
@token_url = 'https://api.line.me/v2/oauth/accessToken'
20+
@auth_path = 'dialog/oauth/weblogin'
21+
end
22+
23+
def get_user_hash(access_token)
24+
response = access_token.get(user_info_path)
25+
auth_hash(access_token).tap do |h|
26+
h[:user_info] = JSON.parse(response.body)
27+
h[:uid] = h[:user_info]['userId'].to_s
28+
end
29+
end
30+
31+
# calculates and returns the url to which the user should be redirected,
32+
# to get authenticated at the external provider's site.
33+
def login_url(_params, _session)
34+
@state = SecureRandom.hex(16)
35+
authorize_url(authorize_url: auth_path)
36+
end
37+
# tries to login the user from access token
38+
def process_callback(params, _session)
39+
args = {}.tap do |a|
40+
a[:code] = params[:code] if params[:code]
41+
end
42+
43+
get_access_token(args, token_url: token_url, token_method: :post)
44+
end
45+
end
46+
end
47+
end

spec/controllers/controller_oauth2_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@
216216
microsoft
217217
instagram
218218
auth0
219+
line
219220
]
220221
)
221222

@@ -257,6 +258,9 @@
257258
sorcery_controller_external_property_set(:auth0, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
258259
sorcery_controller_external_property_set(:auth0, :callback_url, 'http://blabla.com')
259260
sorcery_controller_external_property_set(:auth0, :site, 'https://sorcery-test.auth0.com')
261+
sorcery_controller_external_property_set(:line, :key, "eYVNBjBDi33aa9GkA3w")
262+
sorcery_controller_external_property_set(:line, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
263+
sorcery_controller_external_property_set(:line, :callback_url, "http://blabla.com")
260264
end
261265

262266
after(:each) do
@@ -474,6 +478,7 @@ def set_external_property
474478
microsoft
475479
instagram
476480
auth0
481+
line
477482
]
478483
)
479484
sorcery_controller_external_property_set(:facebook, :key, 'eYVNBjBDi33aa9GkA3w')
@@ -513,6 +518,9 @@ def set_external_property
513518
sorcery_controller_external_property_set(:auth0, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
514519
sorcery_controller_external_property_set(:auth0, :callback_url, 'http://blabla.com')
515520
sorcery_controller_external_property_set(:auth0, :site, 'https://sorcery-test.auth0.com')
521+
sorcery_controller_external_property_set(:line, :key, "eYVNBjBDi33aa9GkA3w")
522+
sorcery_controller_external_property_set(:line, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
523+
sorcery_controller_external_property_set(:line, :callback_url, "http://blabla.com")
516524
end
517525

518526
def provider_url(provider)

spec/rails_app/app/controllers/sorcery_controller.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ def login_at_test_slack
142142
login_at(:slack)
143143
end
144144

145+
def login_at_test_line
146+
login_at(:line)
147+
end
148+
145149
def login_at_test_with_state
146150
login_at(:facebook, state: 'bla')
147151
end
@@ -268,6 +272,14 @@ def test_login_from_auth0
268272
end
269273
end
270274

275+
def test_login_from_line
276+
if @user = login_from(:line)
277+
redirect_to 'bla', notice: 'Success!'
278+
else
279+
redirect_to 'blu', alert: 'Failed!'
280+
end
281+
end
282+
271283
def test_return_to_with_external_twitter
272284
if (@user = login_from(:twitter))
273285
redirect_back_or_to 'bla', notice: 'Success!'
@@ -382,6 +394,14 @@ def test_return_to_with_external_auth0
382394
end
383395
end
384396

397+
def test_return_to_with_external_line
398+
if @user = login_from(:line)
399+
redirect_back_or_to 'bla', notice: 'Success!'
400+
else
401+
redirect_to 'blu', alert: 'Failed!'
402+
end
403+
end
404+
385405
def test_create_from_provider
386406
provider = params[:provider]
387407
login_from(provider)

spec/rails_app/config/routes.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
get :test_login_from_slack
3333
get :test_login_from_instagram
3434
get :test_login_from_auth0
35+
get :test_login_from_line
3536
get :login_at_test
3637
get :login_at_test_twitter
3738
get :login_at_test_facebook
@@ -47,6 +48,7 @@
4748
get :login_at_test_slack
4849
get :login_at_test_instagram
4950
get :login_at_test_auth0
51+
get :login_at_test_line
5052
get :test_return_to_with_external
5153
get :test_return_to_with_external_twitter
5254
get :test_return_to_with_external_facebook
@@ -62,6 +64,7 @@
6264
get :test_return_to_with_external_slack
6365
get :test_return_to_with_external_instagram
6466
get :test_return_to_with_external_auth0
67+
get :test_return_to_with_external_line
6568
get :test_http_basic_auth
6669
get :some_action_making_a_non_persisted_change_to_the_user
6770
post :test_login_with_remember

0 commit comments

Comments
 (0)