606 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			606 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html>
 | 
						|
  <head>
 | 
						|
    <meta charset="utf-8">
 | 
						|
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
						|
    <title>Login Facilitator: OAuth3.org</title>
 | 
						|
    <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
 | 
						|
    <!-- <link rel="stylesheet" type="text/css" href="/css/style.css"> -->
 | 
						|
    <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Lato:300">
 | 
						|
    <script src="https://use.fontawesome.com/3af0faae66.js"></script>
 | 
						|
    <!-- link rel="stylesheet" type="text/css" href="/css/daplie-installer-overrides.css" -->
 | 
						|
  </head>
 | 
						|
 | 
						|
  <body>
 | 
						|
  <div class="fade mock-main">
 | 
						|
 | 
						|
    <!-- STEP 1: ask the user where they want to log in -->
 | 
						|
    <!-- STEP 2: ask the user for their email -->
 | 
						|
    <!-- STEP 3+4: ask for login code and to remember device -->
 | 
						|
    <!-- TODO: remember-me-not implementation? -->
 | 
						|
 | 
						|
    <!--  <button class="btn btn-secondary js-authz-show js-authz-remember-me-not">Just this once</button>-->
 | 
						|
 | 
						|
    <!-- Step 5: ask for permissions -->
 | 
						|
 | 
						|
    <div class="dap-bordered js-userid-container">
 | 
						|
      <p class="org-title">daplie.me</p>
 | 
						|
      <p class="dap-centered-text dap-normal-text welcome-text center-it">Welcome to a new way to login. daplie.me helps you create an Internet ID that allows you to choose what info is shared about you when you login into a site or app online.</p>
 | 
						|
      <form method="post" action="">
 | 
						|
        <div class="form-group">
 | 
						|
          <input type="email" class="form-control dap-input js-oauth3-email emailInput" placeholder="Enter an email address to start"></input>
 | 
						|
        </div>
 | 
						|
        <button class="dap-full-button-green js-authn-show btn btn-primary" disabled>Send authentication email</button>
 | 
						|
      </form>
 | 
						|
      <img src="./img/sponsored-by.png" class="sponsored-by-logo">
 | 
						|
      <!-- <p class="dap-line-around">or</p>
 | 
						|
      <div class="dap-social-media dap-normal-text">
 | 
						|
        <span class="fa fa-2x fa-gray fa-facebook-square js-facebook-login"></span>
 | 
						|
        <span class="fa fa-2x fa-gray fa-twitter-square js-twitter-login"></span>
 | 
						|
        <span class="fa fa-2x fa-gray fa-google-plus-square js-google-login"></span>
 | 
						|
        <span class="fa fa-2x fa-gray fa-github-square js-github-login"></span>
 | 
						|
        <span class="fa fa-2x fa-gray fa-plus-square js-gitlab-login"></span>
 | 
						|
      </div>
 | 
						|
      <br>
 | 
						|
      <a href="./loginwhatis.html" target="_blank"><p class="dap-centered-text dap-help-text">What is this?</p></a> -->
 | 
						|
    </div>
 | 
						|
 | 
						|
    <div class="dap-bordered js-authn">
 | 
						|
      <p class="org-title">daplie.me</p>
 | 
						|
      <!-- <div class="dap-normal-text">
 | 
						|
        <span class="fa fa-3x icon-centered-3x fa-purple fa-envelope"></span>
 | 
						|
      </div>
 | 
						|
      <p class="dap-centered-text dap-scrunch-top dap-normal-text">A special sign-in code was sent to:</p>
 | 
						|
      <p class="dap-centered-text dap-scrunch-both dap-purple-text"><span class="js-user-email"> </span></p>
 | 
						|
      <p class="dap-centered-text dap-scrunch-bottom dap-med-text">Please enter the code below:</p> -->
 | 
						|
      <p class="code-sent-text">Hi, thanks for signing up.</p>
 | 
						|
      <p class="code-sent-text">Please enter the code sent to:</p>
 | 
						|
      <p class="code-sent-text email-address displayed"></p>
 | 
						|
      <p class="code-sent-text pb-40">Be sure to check your spam.</p>
 | 
						|
      <form class="twelve-digit-code" method="post" onsubmit="">
 | 
						|
        <div class="form-group">
 | 
						|
          <p class="code-lasts-text">Code lasts for 15 minutes.</p>
 | 
						|
          <input type="hidden" class="js-authn-otp-uuid">
 | 
						|
          <input class="dap-input js-authn-otp-code form-control" placeholder="XXXX-XXXX-XXXX" maxlength="14"></input>
 | 
						|
          <p class="error-msg"></p>
 | 
						|
        </div>
 | 
						|
        <div class="dap-centered-div dap-space-on-top form-group">
 | 
						|
          <label class="js-remember-label dap-normal-text">
 | 
						|
            <img src="./img/pressed-check.png" class="check js-remember-status">
 | 
						|
            <!-- <span class="fa fa-2x fa-purple fa-square-o dap-remember-margin js-remember-status"></span> -->
 | 
						|
            <span class="dap-remember-me noselect">Remember this device.</span>
 | 
						|
            <input class="js-remember-checkbox hidden" type="checkbox"></input>
 | 
						|
          </label>
 | 
						|
        </div>
 | 
						|
        <button type="submit" class="btn btn-primary submit-btn dap-full-button-green js-submit-code-btn" disabled>Submit</button>
 | 
						|
        <!-- <a href="./authnocode.html" target="_blank" class="btn btn-primary">Send Code Again</a> -->
 | 
						|
        <button class="btn btn-primary js-edit-email-button" type="button">Edit My Email</button>
 | 
						|
      </form>
 | 
						|
      <!-- <a href="./authnocode.html" target="_blank">
 | 
						|
        <p class="dap-centered-text dap-help-text">I didn't receive my code...</p>
 | 
						|
      </a>
 | 
						|
      <a href="./authnopass.html" target="_blank">
 | 
						|
        <p class="dap-centered-text dap-help-text">Why am I not using a password?</p>
 | 
						|
      </a> -->
 | 
						|
      <img src="./img/sponsored-by.png" class="sponsored-by-logo">
 | 
						|
    </div>
 | 
						|
 | 
						|
    <div class="dap-bordered dap-normal-text js-authz">
 | 
						|
      <p class="org-title">daplie.me</p>
 | 
						|
      <!-- <br> -->
 | 
						|
      <!-- <div class="dap-user-plus-app">
 | 
						|
        <span class="fa fa-3x fa-purple fa-user-circle"></span>
 | 
						|
        <span class="fa fa-2x fa-gray fa-plus"></span>
 | 
						|
        <img class="dap-lab-logo" src="./img/Daplie-Badge-Purple.png" alt="Daplie Labs Logo">
 | 
						|
      </div> -->
 | 
						|
      <p class="dap-centered-text dap-normal-text almost-done-text">Almost done. Now it's time to set your preferences.</p>
 | 
						|
      <br>
 | 
						|
 | 
						|
      <form class="js-authorization-decision" action="#">
 | 
						|
        <ul class="js-scopes-container dap-app-auth-list">
 | 
						|
          <li class="checkbox dap-purple-text js-auth-li-enabled">
 | 
						|
            <img src="./img/pressed-check.png" class="check">
 | 
						|
            <span class="dap-small-text js-scope-desc noselect"> </span>
 | 
						|
            <input class="checkbox js-scope-toggle js-auth-checkbox hidden" type="checkbox">
 | 
						|
           </li>
 | 
						|
         </ul>
 | 
						|
 | 
						|
        <div>
 | 
						|
          <button class="dap-full-button-green js-login-allow btn btn-primary" type="button">AUTHORIZE THIS APP</button>
 | 
						|
          <button class="dap-full-button-pink js-login-deny btn btn-primary" type="button">Cancel</button>
 | 
						|
        </div>
 | 
						|
      </form>
 | 
						|
      <img src="./img/sponsored-by.png" class="sponsored-by-logo">
 | 
						|
    </div>
 | 
						|
 | 
						|
    <!-- TODO: Remove Inline Style - Hidden until added into process -->
 | 
						|
    <div style="display: none" class="dap-bordered dap-normal-text">
 | 
						|
      <br>
 | 
						|
      <div class="dap-user-plus-app">
 | 
						|
        <span class="fa fa-3x fa-purple fa-user-circle"></span>
 | 
						|
        <span class="fa fa-2x fa-gray fa-plus"></span>
 | 
						|
        <span class="fa fa-3x fa-purple fa-laptop"></span>
 | 
						|
      </div>
 | 
						|
      <p class="dap-centered-text dap-scrunch-top dap-normal-text">It looks like your user agent is</p>
 | 
						|
      <p><span class="js-sniffed-device"></span></p>
 | 
						|
      <p class="dap-centered-text dap-scrunch-bottom dap-med-text">How long would you like to trust this device?</p>
 | 
						|
      <button class="dap-3-4-button-green js-authz-remember-me">FOREVER</button>
 | 
						|
      <button class="dap-1-4-button-purple js-authz-remember-me-not">ONE DAY</button>
 | 
						|
      <span class="dap-help-text dap-3-4-span">Great if you aren't paranoid.</span>
 | 
						|
      <span class="dap-help-text dap-1-4-span">Great if you're paranoid.</span>
 | 
						|
      <br>
 | 
						|
      <br>
 | 
						|
      <br>
 | 
						|
      <br>
 | 
						|
      <p class="dap-centered-text dap-help-text">What is this?</p>
 | 
						|
    </div>
 | 
						|
 | 
						|
    <div class="dap-bordered dap-normal-text js-logout-container">
 | 
						|
      <p class="dap-centered-text sign-out-text">Sign out of Daplie and all Applications?</p>
 | 
						|
      <button type="button" class="dap-full-button-green js-logout btn btn-primary">Sign Out</button>
 | 
						|
      <img src="./img/sponsored-by.png" class="sponsored-by-logo">
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
 | 
						|
  <div class="fade js-playground" ng-app="oauth3Playground" ng-strict>
 | 
						|
    <div ng-controller="PlaygroundCtrl as vm">
 | 
						|
      <div class="container">
 | 
						|
        <div class="jumbotron">
 | 
						|
          <h1>OAuth3 Playground</h1>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <div class="row">
 | 
						|
          <div class="col-md-12">
 | 
						|
            <h2>Go ahead, test our login</h2>
 | 
						|
 | 
						|
            <div ng-if="vm.error" class="alert alert-warning"><span ng-bind="vm.error.message"></span><button class="btn btn-danger pull-right" type="button" ng-click="vm.error = null">X</button></div>
 | 
						|
            <div ng-if="vm._working" class="alert alert-info">
 | 
						|
              <marquee>taking my sweet time to do something in the background...</marquee>
 | 
						|
            </div>
 | 
						|
            <div ng-if="vm.validated.provider" class="alert alert-success"><span ng-bind="vm.validated.provider"></span> will be used as the login issuer</div>
 | 
						|
 | 
						|
            <label>Address:</label>
 | 
						|
            <input type="text" placeholder="ex: john@example.com (optional)" class="form-control" ng-model="vm.form.id" ng-change="vm.fn.changeUser()">
 | 
						|
            <label ng-if="vm.advanced">Identity Issuer:</label>
 | 
						|
            <input ng-if="vm.advanced" type="text" class="form-control" ng-model="vm.form.provider" placeholder="ex: sso.example.com (required)" ng-change="vm.fn.changeProvider()">
 | 
						|
            <button class="btn btn-link" ng-if="!vm.advanced" ng-click="vm.fn.toggleAdvanced()">open advanced</button>
 | 
						|
            <button class="btn btn-link" ng-if="vm.advanced" ng-click="vm.fn.toggleAdvanced()">close advanced</button>
 | 
						|
            <button class="btn btn-primary" ng-click="vm.api.implicitGrant()" ng-disabled="!vm.validated.provider">Login</button>
 | 
						|
            <label><input type="checkbox" ng-model="vm.conf.debug" ng-change="vm.fn.updateDebug()"/> Debug OAuth3 Flow?</label>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <div class="row">
 | 
						|
          <div class="col-md-12">
 | 
						|
            <br/>
 | 
						|
            <br/>
 | 
						|
            <br/>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <div class="row">
 | 
						|
          <div class="col-md-12">
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <div class="col-md-12">
 | 
						|
                <h2>Debug & Status Info:</h2>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <div class="col-md-12">
 | 
						|
                <h3>JavaScript Framework</h3>
 | 
						|
                <small>(yes, real runs-in-a-web-browser - and even on Android - ES5.1)</small>
 | 
						|
                <br>
 | 
						|
                <label><input name="framework" type="radio" ng-model="vm.framework" ng-value="'none'"/> ES5.1</label> (no framework)
 | 
						|
                <label><input name="framework" type="radio" ng-model="vm.framework" ng-value="'jquery'"/> jQuery</label>
 | 
						|
                <label><input name="framework" type="radio" ng-model="vm.framework" ng-value="'angularjs'"/> AngularJS</label>
 | 
						|
                <label><input name="framework" type="radio" ng-model="vm.framework" ng-value="'nodejs'"/> node.js</label>
 | 
						|
                <br>
 | 
						|
 | 
						|
                <label><input name="framework" type="checkbox" checked="checked" disabled="disabled"/> azp<small>@oauth3.org</small></label>
 | 
						|
                <label><input name="framework" type="checkbox" ng-model="vm.components.issuer"/> issuer<small>@oauth3.org</small></label>
 | 
						|
                <br>
 | 
						|
 | 
						|
                <pre ng-if="'nodejs' === vm.framework"><code>var OAUTH3 = require('oauth3.org');</code></pre>
 | 
						|
 | 
						|
                <pre ng-if="'nodejs' !== vm.framework"><code><script src="/assets/oauth3.org/oauth3.core.js"></script><span ng-if="vm.components.issuer">
 | 
						|
<script src="/assets/oauth3.org/oauth3.crypto.js"></script>
 | 
						|
<script src="/assets/oauth3.org/oauth3.issuer.js"></script></span><span
 | 
						|
  ng-if="'none' === vm.framework || 'jquery' === vm.framework"></span><span ng-if="'angularjs' === vm.framework">
 | 
						|
<script src="/assets/oauth3.org/oauth3.ng.js"></script></span>
 | 
						|
</code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Client URI</strong>: <span ng-bind="vm.conf.client_uri"></span>
 | 
						|
                <br>
 | 
						|
                (this is the URL of the application as per window.location.href)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <input class="form-input" type="text" ng-model="vm.clientUri">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.clientUri()">Set</button>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.clientUri({ host: "<span ng-bind="vm.clientUri"></span>", port: null, pathname: '/' });</code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Subject</strong>: <span ng-bind="vm.form.subject"></span>
 | 
						|
                <br>
 | 
						|
                (this is either the subject portion or whole address of subject@issuer)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <input class="form-input" type="text" ng-model="vm.form.id">
 | 
						|
                <button class="btn btn-default" ng-click="vm.fn.changeUser()">Set</button>
 | 
						|
 | 
						|
                <pre><code>address: <span ng-bind="vm.form.id"></span></code></pre>
 | 
						|
                <pre><code>subject: <span ng-bind="vm.form.subject"></span></code></pre>
 | 
						|
                <pre><code>issuer: <span ng-bind="vm.form.userProvider"></span></code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Issuer URI</strong>: <span ng-bind="vm.validated.provider"></span>
 | 
						|
                <br>
 | 
						|
                (this is the URL part of subject@issuer)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <input class="form-input" type="text" ng-model="vm.form.provider">
 | 
						|
                <button class="btn btn-default" ng-click="vm.fn.changeProvider()">Set</button>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Directives Discovery</strong>:
 | 
						|
                <br>
 | 
						|
                (this is how we learn if a server support oauth3 and to what extent)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <button class="btn btn-default" ng-click="vm.fn.changeProvider()">Discover Directives</button>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.urls.discover("<span ng-bind="vm.form.provider"></span>", opts);</code></pre>
 | 
						|
                <pre ng-if="vm.directivesUrl"><code><span ng-bind="vm.directivesUrl"></span></code></pre>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.discover("<span ng-bind="vm.form.provider"></span>", opts);</code></pre>
 | 
						|
                <pre ng-if="vm.discoveryUrl"><code><span ng-bind="vm.discoveryUrl"></span></code></pre>
 | 
						|
 | 
						|
                <button ng-if="vm.directives" class="btn btn-default" ng-click="vm.fn.clearDirectives()">[X]</button>
 | 
						|
                <pre ng-if="vm.directives"><code><span ng-bind="vm.directives | json"></span></code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Scopes</strong>: <span ng-bind="vm.form.scopes"></span>
 | 
						|
                <br>
 | 
						|
                (these are used to lookup the descriptions of grant permissions)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <input class="form-input" type="text" ng-model="vm.form.scopes" placeholder="ex: authn@oauth3.org,photos@example.com,dns@domains.org">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.discoverScopes()" ng-disabled="!vm.form.scopes">Discover Scopes</button>
 | 
						|
 | 
						|
                <ul>
 | 
						|
                  <li ng-repeat="scope in vm.defaults.scopes">
 | 
						|
                    <label>
 | 
						|
                      <input type="checkbox" ng-model="scope.checked" ng-change="vm.fn.updateScopes()"/>
 | 
						|
                      <strong ng-bind="scope.name">name</strong>
 | 
						|
                    </label>
 | 
						|
                    <span ng-bind="scope.desc">desc</span>
 | 
						|
                  </li>
 | 
						|
                </ul>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.urls.scope(directives, opts);</code></pre>
 | 
						|
                <pre ng-if="vm.scopeUrl"><code><span ng-bind="vm.scopeUrl"></span></code></pre>
 | 
						|
                <pre ng-if="vm.discoverScopeUrl"><code><span ng-bind="vm.discoverScopeUrl"></span></code></pre>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.discoverScopes(directives, opts);</code></pre>
 | 
						|
 | 
						|
                <button ng-if="vm.scopesObj" class="btn btn-default" ng-click="vm.fn.clearScopes()">[X]</button>
 | 
						|
                <pre ng-if="vm.scopesObj"><code><span ng-bind="vm.scopesObj | json"></span></code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Authorization Dialog URL</strong>
 | 
						|
                <br>
 | 
						|
                (this is what opens the login dialog box with the checkboxes and such)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.implicitGrant()" ng-disabled="!vm.directives || !vm.validated.provider">Open Dialog Window</button>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.urls.implicitGrant(directives, opts);</code></pre>
 | 
						|
                <pre ng-if="vm.implicitGrantUrl"><code><span ng-bind="vm.implicitGrantUrl"></span></code></pre>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.implicitGrant(directives, opts);</code></pre>
 | 
						|
 | 
						|
                <button ng-if="vm.session" class="btn btn-default" ng-click="vm.fn.clearSession()">[X]</button>
 | 
						|
                <pre ng-if="vm.session"><code><span ng-bind="vm.session | json"></span></code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <h2>1st Party and App Login</h2>
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Credential Meta URL</strong>
 | 
						|
                <br>
 | 
						|
                <strong>(Not implemented... anymore)</strong>
 | 
						|
                <br>
 | 
						|
                (this is the endpoint that reports if the user exists and what their proof-strategy is)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.authn.credentialMeta()" ng-disabled="true || !vm.directives || !vm.form.id">Check user details</button>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.authn.loginMeta(directives, { email: "<span ng-bind="vm.form.id"></span>" });</code></pre>
 | 
						|
                <pre ng-if="vm.urls.credentialMeta"><code><span ng-bind="vm.urls.credentialMeta"></span></code></pre>
 | 
						|
                <pre ng-if="vm.responses.credentialMeta"><code><span ng-bind="vm.responses.credentialMeta"></span></code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Credential OTP URL</strong>
 | 
						|
                <br>
 | 
						|
                (this is the URL that sends your one-time password via email)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.authn.otp()" ng-disabled="!vm.directives || !vm.form.id">Send OTP to user</button>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.authn.otp(directives, { email: "<span ng-bind="vm.form.id"></span>" });</code></pre>
 | 
						|
                <div ng-if="vm.urls.otp">
 | 
						|
                  <pre><code><span ng-bind="vm.urls.otp.method"></span> <span ng-bind="vm.urls.otp.url"></span>
 | 
						|
<span ng-if="vm.urls.otp.headers" ng-bind="vm.urls.otp.headers | json"></span>
 | 
						|
<span ng-bind="vm.urls.otp.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                  <pre ng-if="vm.responses.otp"><code><span ng-bind="vm.responses.otp.status"></span>
 | 
						|
<span ng-if="vm.responses.otp.headers" ng-bind="vm.responses.otp.headers | json"></span>
 | 
						|
<span ng-bind="vm.responses.otp.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                </div>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Resource Owner Password URL</strong>
 | 
						|
                <br>
 | 
						|
                (this is the URL that native apps and APIs use to login)
 | 
						|
                <br>
 | 
						|
                (it's also a bit of a misnomer, it should be *proof* rather than password)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <input class="form-input" type="text" ng-model="vm.form.otpCode" ng-change="vm.api.urls.resourceOwnerPassword()" placeholder="ex: XXXX-XXXX-XXXX">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.authn.resourceOwnerPassword()" ng-disabled="!vm.form.otpUuid || !vm.form.otpCode">Exchange Proof for Session</button>
 | 
						|
 | 
						|
                <br>
 | 
						|
                <input class="form-input disabled" type="text" ng-model="vm.form.otpUuid" disabled>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.authn.resourceOwnerPassword(directives, <span ng-bind="vm.api.authn._ropOpts_"></span>);</code></pre>
 | 
						|
                <div ng-if="vm.urls.resourceOwnerPassword">
 | 
						|
                  <pre><code><span ng-bind="vm.urls.resourceOwnerPassword.method"></span> <span ng-bind="vm.urls.resourceOwnerPassword.url"></span>
 | 
						|
<span ng-if="vm.urls.resourceOwnerPassword.headers" ng-bind="vm.urls.resourceOwnerPassword.headers | json"></span>
 | 
						|
<span ng-bind="vm.urls.resourceOwnerPassword.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                  <pre ng-if="vm.responses.resourceOwnerPassword"><code><span ng-bind="vm.responses.resourceOwnerPassword.status"></span>
 | 
						|
<span ng-if="vm.responses.resourceOwnerPassword.headers" ng-bind="vm.responses.resourceOwnerPassword.headers | json"></span>
 | 
						|
<span ng-bind="vm.responses.resourceOwnerPassword.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                </div>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Session Token</strong>
 | 
						|
                <br>
 | 
						|
                (this is the access token)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <textarea class="form-control" ng-model="vm.accessToken" ng-change="vm.api.jwt.decode()"></textarea>
 | 
						|
                <textarea ng-if="vm.refreshToken" class="form-control" ng-model="vm.refreshToken" ng-change="vm.api.jwt.decodeRefresh()"></textarea>
 | 
						|
 | 
						|
                <pre ng-if="vm.ropToken"><code ng-bind="vm.ropToken | json"></code></pre>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
 | 
						|
            <div class="row" ng-if="vm.validated.provider">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Verify Token</strong>
 | 
						|
                <br>
 | 
						|
                <strong>(not implemented)</strong>
 | 
						|
                <br>
 | 
						|
                (this is the URL that inspects and verifies the token)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <textarea class="form-control" ng-model="vm.accessToken"></textarea>
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.authn.verify()" ng-disabled="!vm.directives || !vm.form.id">Verify Token</button>
 | 
						|
                <textarea ng-if="vm.refreshToken" class="form-control" ng-model="vm.refreshToken"></textarea>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.authn.verify(directives, token});</code></pre>
 | 
						|
                <pre><code>OAUTH3.authn.verify( directives, "<span ng-bind="vm.accessToken"></span>" });</code></pre>
 | 
						|
                <div ng-if="vm.urls.verify">
 | 
						|
                  <pre><code><span ng-bind="vm.urls.verify.method"></span> <span ng-bind="vm.urls.verify.url"></span>
 | 
						|
<span ng-if="vm.urls.verify.headers" ng-bind="vm.urls.verify.headers | json"></span>
 | 
						|
<span ng-bind="vm.urls.verify.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                  <pre ng-if="vm.responses.verify"><code><span ng-bind="vm.responses.verify.status"></span>
 | 
						|
<span ng-if="vm.responses.verify.headers" ng-bind="vm.responses.verify.headers | json"></span>
 | 
						|
<span ng-bind="vm.responses.verify.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                </div>
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <br>
 | 
						|
              <br>
 | 
						|
              <div class="col-md-3">
 | 
						|
                <strong>Approved Apps</strong>
 | 
						|
                <br>
 | 
						|
                (these are the public keys generated on remember-me devices and the opaque tokens issued to remember-me-not devices)
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                <button class="btn btn-default" ng-click="vm.api.authz.grants()" ng-disabled="!vm.form.accessToken">List App Grants</button>
 | 
						|
                <br>
 | 
						|
 | 
						|
                <pre><code>OAUTH3.urls.grants(directives, opts);</code></pre>
 | 
						|
                <pre><code>OAUTH3.authz.grants(directives, <span ng-bind="vm.api.authz._grantsOpts_"></span>);</code></pre>
 | 
						|
 | 
						|
                <div ng-if="vm.urls.grants">
 | 
						|
                  <pre><code><span ng-bind="vm.urls.grants.method"></span> <span ng-bind="vm.urls.grants.url"></span>
 | 
						|
<span ng-if="vm.urls.grants.headers" ng-bind="vm.urls.grants.headers | json"></span>
 | 
						|
<span ng-bind="vm.urls.grants.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                  <pre ng-if="vm.responses.grants"><code><span ng-bind="vm.responses.grants.status"></span>
 | 
						|
<span ng-if="vm.responses.grants.headers" ng-bind="vm.responses.grants.headers | json"></span>
 | 
						|
<span ng-bind="vm.responses.grants.data | json"></span>
 | 
						|
</code></pre>
 | 
						|
                </div>
 | 
						|
                ...
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
            <div class="row">
 | 
						|
              <div class="col-md-3">
 | 
						|
                Approved Applications:
 | 
						|
              </div>
 | 
						|
              <div class="col-md-9">
 | 
						|
                ...
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <div class="row">
 | 
						|
          <div class="col-md-12">
 | 
						|
            <br/>
 | 
						|
            <br/>
 | 
						|
            <br/>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <div class="row">
 | 
						|
          <div class="col-md-12">
 | 
						|
            <h2>Docs</h2>
 | 
						|
 | 
						|
            <p>0. Include the Library
 | 
						|
            <pre><code># Browsers
 | 
						|
  <script src="oauth3.core.js"></script>
 | 
						|
  var OAUTH3 = window.OAUTH3;
 | 
						|
 | 
						|
  # Node.js
 | 
						|
  var OAUTH3 = require('oauth3.js').OAUTH3;
 | 
						|
  </code></pre>
 | 
						|
 | 
						|
            <p>1. Establish the Client ID by its URI
 | 
						|
            <pre><code># Browsers
 | 
						|
  var clientUri = OAUTH3.clientUri(window.location); // example.com
 | 
						|
 | 
						|
  # Node.js
 | 
						|
  var clientUri = OAUTH3.clientUri("https://example.com"); // example.com
 | 
						|
  </code></pre>
 | 
						|
 | 
						|
            <p>2. Provide promisable storage hooks for saving sessions and caching directives
 | 
						|
            <pre><code>OAUTH3._hooks = {
 | 
						|
    directives: {
 | 
						|
      get: function (providerUri) { ... }
 | 
						|
    , set: function (providerUri, directives) { ... }
 | 
						|
    , all: function () { ... }
 | 
						|
    , clear: function () { ... }
 | 
						|
  , sessions: {
 | 
						|
      get: function (providerUri, id) { ... }
 | 
						|
    , set: function (providerUri, newSession, id) { ... }
 | 
						|
    , all: function (providerUri) { ... }
 | 
						|
    , clear: function (providerUri) { ... }
 | 
						|
    }
 | 
						|
  };
 | 
						|
  </code></pre>
 | 
						|
            SECURITY: The default storage engine is window.sessionStorage. Session storage
 | 
						|
            should be used for app:// urls and localhost urls and other applications
 | 
						|
            in which the identity of the app is ephemeral, arbitrary, or not distinct.
 | 
						|
 | 
						|
            <p><h4>3. Check to see if the user already has a session</h4>
 | 
						|
            <pre><code>OAUTH3.hooks.session.get(providerUri).then(function (session) {
 | 
						|
    console.log('[DEBUG] session:');
 | 
						|
    console.log(session);
 | 
						|
  });
 | 
						|
  OAUTH3.hooks.session.all().then(function (sessions) {
 | 
						|
    console.log('[DEBUG] all sessions:');
 | 
						|
    console.log(sessions);
 | 
						|
  });
 | 
						|
  </code></pre>
 | 
						|
            Note: expired sessions should not be returned and stale sessions should be refreshed
 | 
						|
 | 
						|
            <p>4. Prompt the user for their address and perform the lookup to see if it
 | 
						|
            has a provider.
 | 
						|
            <pre><code>var providerUri = address.split('@')[1] || address;
 | 
						|
  var opts = { client_uri: clientUri };
 | 
						|
  OAUTH3.discover(providerUri, opts).then(function (dir) {
 | 
						|
    console.log('[DEBUG] directives:');
 | 
						|
    console.log(dir);
 | 
						|
  });
 | 
						|
  </code></pre>
 | 
						|
 | 
						|
            <p>4.
 | 
						|
            <pre><code>
 | 
						|
  </code></pre>
 | 
						|
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
 | 
						|
 | 
						|
  <!--[if IE]><script src="bower_components/rsvp.js/rsvp.js"></script><![endif]-->
 | 
						|
  <script src="./js/jquery-2.2.0.min.js"></script>
 | 
						|
  <script src="./js/jquery.mask.min.js"></script>
 | 
						|
  <script src="./js/bootstrap.min.js"></script>
 | 
						|
  <script src="/assets/oauth3.org/oauth3.core.js"></script>
 | 
						|
  <script src="/assets/oauth3.org/oauth3.crypto.js"></script>
 | 
						|
  <script src="/assets/oauth3.org/oauth3.issuer.js"></script>
 | 
						|
  <script src="./js/issuer.js"></script>
 | 
						|
  <script src="./js/script.js"></script>
 | 
						|
 | 
						|
  <script src="./js/angular-1.6.6.js"></script>
 | 
						|
  <script src="./js/angular-ui-router-1.0.10.js"></script>
 | 
						|
  <script src="/assets/oauth3.org/oauth3.ng.js"></script>
 | 
						|
  <script src="./js/playground.js"></script>
 | 
						|
 | 
						|
  </body>
 | 
						|
</html>
 |