discourse/lib/auth/github_authenticator.rb

60 lines
1.4 KiB
Ruby

class Auth::GithubAuthenticator < Auth::Authenticator
def name
"github"
end
def after_authenticate(auth_token)
result = Auth::Result.new
data = auth_token[:info]
result.username = screen_name = data["nickname"]
result.email = email = data["email"]
github_user_id = auth_token["uid"]
result.extra_data = {
github_user_id: github_user_id,
github_screen_name: screen_name,
}
user_info = GithubUserInfo.where(github_user_id: github_user_id).first
if user_info
user = user_info.user
elsif user = User.find_by_email(email)
user_info = GithubUserInfo.create(
user_id: user.id,
screen_name: screen_name,
github_user_id: github_user_id
)
end
result.user = user
result.email_valid = false
result
end
def after_create_account(user, auth)
data = auth[:extra_data]
GithubUserInfo.create(
user_id: user.id,
screen_name: data[:github_screen_name],
github_user_id: data[:github_user_id]
)
end
def register_middleware(omniauth)
omniauth.provider :github,
:setup => lambda { |env|
strategy = env["omniauth.strategy"]
strategy.options[:client_id] = SiteSetting.github_client_id
strategy.options[:client_secret] = SiteSetting.github_client_secret
},
:scope => "user:email"
end
end