32 lines
662 B
Ruby
32 lines
662 B
Ruby
require "openssl"
|
|
|
|
class DiscourseClient
|
|
def initialize(user, params = {})
|
|
@user = user
|
|
@params = params
|
|
end
|
|
|
|
def generate_url
|
|
uri = URI(ENV.fetch("DISCOURSE_AUTH_URL"))
|
|
|
|
if OpenSSL::HMAC.hexdigest("sha256", ENV.fetch("DISCOURSE_SECRET"), sso) == sig
|
|
nonce = Base64.decode64(sso)
|
|
sso = Base64.encode64(nonce + "&email=" + @user.email + "&external_id=" + @user.external_id)
|
|
sig = OpenSSL::HMAC.hexdigest("sha256", ENV.fetch("DISCOURSE_SECRET"), sso)
|
|
uri.query = {sso: sso, sig: sig}.to_query
|
|
end
|
|
|
|
uri.to_s
|
|
end
|
|
|
|
private
|
|
|
|
def sig
|
|
@params.fetch(:sig)
|
|
end
|
|
|
|
def sso
|
|
@params.fetch(:sso)
|
|
end
|
|
end
|