mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-05 12:46:33 +08:00
This adds a link for each authentication providers that are listed in /my/preferences/account in the "Associated Accounts" section. This is particularly useful when Discourse is being used in the PWA or in the DiscourseMobile app where there's no browser bar available and the only way to visit the provider's website is to open a browser window. That way, they can _just_ click the provider's name. Internal ref - t/156255 --- **BEFORE**  **AFTER** 
75 lines
1.8 KiB
Ruby
75 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Auth::LinkedInOidcAuthenticator < Auth::ManagedAuthenticator
|
|
class LinkedInOidc < OmniAuth::Strategies::OAuth2
|
|
option :name, "linkedin_oidc"
|
|
|
|
option :client_options,
|
|
{
|
|
site: "https://api.linkedin.com",
|
|
authorize_url: "https://www.linkedin.com/oauth/v2/authorization?response_type=code",
|
|
token_url: "https://www.linkedin.com/oauth/v2/accessToken",
|
|
}
|
|
|
|
option :scope, "openid profile email"
|
|
|
|
uid { raw_info["sub"] }
|
|
|
|
info do
|
|
{
|
|
email: raw_info["email"],
|
|
first_name: raw_info["given_name"],
|
|
last_name: raw_info["family_name"],
|
|
image: raw_info["picture"],
|
|
}
|
|
end
|
|
|
|
extra { { "raw_info" => raw_info } }
|
|
|
|
def callback_url
|
|
full_host + script_name + callback_path
|
|
end
|
|
|
|
def raw_info
|
|
@raw_info ||= access_token.get(profile_endpoint).parsed
|
|
end
|
|
|
|
private
|
|
|
|
def profile_endpoint
|
|
"/v2/userinfo"
|
|
end
|
|
end
|
|
|
|
def name
|
|
"linkedin_oidc"
|
|
end
|
|
|
|
def display_name
|
|
"LinkedIn"
|
|
end
|
|
|
|
def provider_url
|
|
"https://www.linkedin.com"
|
|
end
|
|
|
|
def enabled?
|
|
SiteSetting.enable_linkedin_oidc_logins
|
|
end
|
|
|
|
def register_middleware(omniauth)
|
|
omniauth.provider LinkedInOidc,
|
|
setup:
|
|
lambda { |env|
|
|
strategy = env["omniauth.strategy"]
|
|
strategy.options[:client_id] = SiteSetting.linkedin_oidc_client_id
|
|
strategy.options[:client_secret] = SiteSetting.linkedin_oidc_client_secret
|
|
}
|
|
end
|
|
|
|
# LinkedIn doesn't let users login to websites unless they verify their e-mail
|
|
# address, so whatever e-mail we get from LinkedIn must be verified.
|
|
def primary_email_verified?(_auth_token)
|
|
true
|
|
end
|
|
end
|