anchor.diff:          end
       </pre>
   
  -    Once, key and a secret matches, it then within the same 'lti_authorize!'
  -    endpoint checks if the request is valid or not, or if the timestamp on
  -    request is too old. If so, then it returns an error otherwise, it return
  -    true to launch endpoint, which means the request is valid.<br><br>
  +    If the key and secret match, then within the same 'lti_authorize!' endpoint
  +    OpenDSA checks if the request is valid or not, or if the timestamp on the
  +    request is too old. If so, then OpenDSA returns an error otherwise, returns
  +    <em>'true'</em> to launch endpoint, which means the request is valid.
  +    <br><br>
   
       <pre>
           if !params.has_key?(:selection_directive)
  
positive.code:         course_offerings: {lms_course_num: params[:custom_canvas_course_id]}
        ).first
      </pre>
      After that it calls 'lti_authorize!' endpoint to validate the request
      received.<br><br>
      <pre>
        render('error') and return unless lti_authorize!
      </pre>
  
      Within lti_authorize endpoint, it creates a tool provider object from the
      authentication object created above. If a key and secret does not match, it
      throws an error and return.<br><br>
  
      <pre>
        def lti_authorize!
  
negative.code:       end
      </pre>
  
      Once the request has been validated, OpenDSA returns back to the
      <em>"launch_ex"</em> endpoint and calls <em>"ensure_user"</em> method after
      that.<br><br>
      <pre>
        ensure_user()
      </pre>
  
      Within 'ensure_user' method, OpenDSA checks if a user with the same email
      exists or not and creates a new user if that email is not found and
      finally, signs in that user to start his session.<br><br>
      <pre>
        def ensure_user
          email = params[:lis_person_contact_email_primary]
  