class Riddl::Utils::OAuth2::UnivieApp::VerifyIdentity

Public Instance Methods

response() click to toggle source
# File lib/ruby/riddl/utils/oauth2-univie.rb, line 77
def response
  code = Base64::urlsafe_decode64 @p[0].value
  access_tokens  = @a[0]
  refresh_tokens = @a[1]
  codes          = @a[2]
  client_id      = @a[3]
  client_secret  = @a[4]
  adur           = @a[5]
  rdur           = @a[6]
  client_pass    = "#{client_id}:#{client_secret}"

  user_id, decrypted = Riddl::Utils::OAuth2::Helper::decrypt_with_shared_secret(code, client_pass).split(':', 2) rescue [nil,nil]
  if user_id.nil?
    @status = 403
    return Riddl::Parameter::Complex.new('data', 'application/json', {
      :error => 'Code invalid. Client_id or client_secret not suitable for decryption.'
    }.to_json)
  else
    token, refresh_token = Riddl::Utils::OAuth2::Helper::generate_optimistic_token(client_id, client_pass, adur, rdur)
    codes.set(code, refresh_token, rdur)
    access_tokens.set(token, user_id, rdur) # not adur, to identify expired access tokens
    refresh_tokens.set(refresh_token, token, rdur)

    json_response = {
      :access_token => token,
      :refresh_token => refresh_token,
      :code => Base64.urlsafe_encode64(decrypted),
      :user_id => user_id
    }.to_json

    Riddl::Parameter::Complex.new('data', 'application/json', json_response)
  end
end