mirror of
https://github.com/discourse/discourse.git
synced 2025-02-19 07:13:24 +08:00

OAuth2Authenticator is considered deprecated, and isn't used in core. However, some plugins still depend on it, and this was breaking the signup of previously-staged users. There is no easy way to make an end-end test of this in core, but I will be adding an integration test in the SAML plugin.
59 lines
1.6 KiB
Ruby
59 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Auth::OAuth2Authenticator < Auth::Authenticator
|
|
|
|
def name
|
|
@name
|
|
end
|
|
|
|
# only option at the moment is :trusted
|
|
def initialize(name, opts = {})
|
|
@name = name
|
|
@opts = opts
|
|
end
|
|
|
|
def after_authenticate(auth_token)
|
|
|
|
result = Auth::Result.new
|
|
|
|
oauth2_provider = auth_token[:provider]
|
|
oauth2_uid = auth_token[:uid]
|
|
data = auth_token[:info]
|
|
result.email = email = data[:email]
|
|
result.name = name = data[:name]
|
|
|
|
oauth2_user_info = Oauth2UserInfo.find_by(uid: oauth2_uid, provider: oauth2_provider)
|
|
|
|
if !oauth2_user_info && @opts[:trusted] && user = User.find_by_email(email)
|
|
oauth2_user_info = Oauth2UserInfo.create(uid: oauth2_uid,
|
|
provider: oauth2_provider,
|
|
name: name,
|
|
email: email,
|
|
user: user)
|
|
end
|
|
|
|
result.user = oauth2_user_info.try(:user)
|
|
result.email_valid = @opts[:trusted]
|
|
|
|
result.extra_data = {
|
|
uid: oauth2_uid,
|
|
provider: oauth2_provider
|
|
}
|
|
|
|
result
|
|
end
|
|
|
|
def after_create_account(user, auth)
|
|
data = auth[:extra_data]
|
|
association = Oauth2UserInfo.find_or_initialize_by(provider: data[:provider], uid: data[:uid])
|
|
association.user = user
|
|
association.email = auth[:email]
|
|
association.save!
|
|
end
|
|
|
|
def description_for_user(user)
|
|
info = Oauth2UserInfo.find_by(user_id: user.id, provider: @name)
|
|
info&.email || info&.name || info&.uid || ""
|
|
end
|
|
end
|