140 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <html>
 | |
|   <head>
 | |
|     <title>Telebit Account</title>
 | |
|   </head>
 | |
|   <body>
 | |
|     <h1>Login</h1>
 | |
|     <form class="js-auth-form">
 | |
|       <input class="js-auth-subject" placeholder="email" type="email"/>
 | |
|       <button class="js-auth-submit" type="submit">Login</button>
 | |
|     </form>
 | |
| 
 | |
|     <div class="v-app">
 | |
| 			<ol>
 | |
| 				<li v-for="domain in domains">
 | |
| 					{{ domain }}
 | |
| 				</li>
 | |
| 			</ol>
 | |
|     </div>
 | |
| 
 | |
|     <!-- development version, includes helpful console warnings -->
 | |
|     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 | |
| 
 | |
|     <script src="assets/oauth3.org/oauth3.core.js"></script>
 | |
|     <script>
 | |
|       (function () {
 | |
|         'use strict';
 | |
|         var OAUTH3 = window.OAUTH3;
 | |
|         var oauth3 = OAUTH3.create({
 | |
|           host: window.location.host
 | |
|         , pathname: window.location.pathname.replace(/\/[^\/]*$/, '/')
 | |
|         });
 | |
|         var $ = function () { return document.querySelector.apply(document, arguments); }
 | |
| 
 | |
|         function onChangeProvider(providerUri) {
 | |
|           // example https://oauth3.org
 | |
|           return oauth3.setIdentityProvider(providerUri);
 | |
|         }
 | |
| 
 | |
|         // This opens up the login window for the specified provider
 | |
|         //
 | |
|         function onClickLogin(ev) {
 | |
|           ev.preventDefault();
 | |
|           ev.stopPropagation();
 | |
| 
 | |
|           var email = $('.js-auth-subject').value;
 | |
| 
 | |
|           // TODO check subject for provider viability
 | |
|           return oauth3.authenticate({
 | |
|             subject: email
 | |
|           , scope: 'email@oauth3.org'
 | |
|           }).then(function (session) {
 | |
| 
 | |
|             console.info('Authentication was Successful:');
 | |
|             console.log(session);
 | |
| 
 | |
|             // You can use the PPID (or preferably a hash of it) as the login for your app
 | |
|             // (it securely functions as both username and password which is known only by your app)
 | |
|             // If you use a hash of it as an ID, you can also use the PPID itself as a decryption key
 | |
|             //
 | |
|             console.info('Secure PPID (aka subject):', session.token.sub);
 | |
| 
 | |
|             function listStuff(data) {
 | |
|               //window.alert("TODO: show authorized devices, domains, and connectivity information");
 | |
|               var app6 = new Vue({
 | |
|                 el: '.v-app',
 | |
|                 data: {
 | |
|                   domains: data.domains
 | |
|                 }
 | |
|               });
 | |
|             }
 | |
| 
 | |
|             return oauth3.request({
 | |
|               url: 'https://api.oauth3.org/api/issuer@oauth3.org/jwks/:sub/:kid.json'
 | |
|                 .replace(/:sub/g, session.token.sub)
 | |
|                 .replace(/:kid/g, session.token.iss)
 | |
|             , session: session
 | |
|             }).then(function (resp) {
 | |
|               console.info("Public Key:");
 | |
|               console.log(resp.data);
 | |
| 
 | |
|               return oauth3.request({
 | |
|                 url: 'https://api.oauth3.org/api/issuer@oauth3.org/acl/profile'
 | |
|               , session: session
 | |
|               }).then(function (resp) {
 | |
| 
 | |
|                 console.info("Inspect Token:");
 | |
|                 console.log(resp.data);
 | |
| 
 | |
|                 return oauth3.request({
 | |
|                   url: 'https://api.' + location.hostname + '/api/telebit.cloud/account'
 | |
|                 , session: session
 | |
|                 }).then(function (resp) {
 | |
| 
 | |
|                   console.info("Telebit Account:");
 | |
|                   console.log(resp.data);
 | |
| 
 | |
|                   if (resp.data && resp.data.domains) {
 | |
|                     listStuff(resp.data);
 | |
|                     return;
 | |
|                   }
 | |
| 
 | |
|                   if (1 === resp.data.accounts.length) {
 | |
|                     listStuff(resp);
 | |
|                   } else if (0 === resp.data.accounts.length) {
 | |
|                     return oauth3.request({
 | |
|                       url: 'https://api.' + location.hostname + 'api/telebit.cloud/account'
 | |
|                     , method: 'POST'
 | |
|                     , session: session
 | |
|                     , body: {
 | |
|                         email: email
 | |
|                       }
 | |
|                     }).then(function (resp) {
 | |
|                       listStuff(resp);
 | |
|                     });
 | |
|                   } if (resp.data.accounts.length > 2) {
 | |
|                     window.alert("Multiple accounts.");
 | |
|                   } else {
 | |
|                     window.alert("Bad response.");
 | |
|                   }
 | |
| 
 | |
|                 });
 | |
| 
 | |
| 
 | |
|               });
 | |
| 
 | |
|             });
 | |
| 
 | |
|           }, function (err) {
 | |
|             console.error('Authentication Failed:');
 | |
|             console.log(err);
 | |
|           });
 | |
|         }
 | |
| 
 | |
|         $('body form.js-auth-form').addEventListener('submit', onClickLogin);
 | |
|         onChangeProvider('oauth3.org');
 | |
|       }());
 | |
|     </script>
 | |
|   </body>
 | |
| </html>
 |