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.find_by(github_user_id: github_user_id) result.email_valid = !!data["email_verified"] if user_info user = user_info.user elsif result.email_valid && (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 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