将Amazon Cognito与单页面应用程序(Vue.js)集成

在本文中,我们将研究使用OAuth协议通过Amazon Cognito对单页应用程序(使用Vue.js构建)进行身份验证。 在上一篇文章中,我们将服务器端应用程序与Amazon Cognito集成在一起。

搭建单页应用程序

我们将使用vue-cli创建一个空的Vuejs应用程序。 可以按照此处的说明安装Vue CLI。

让我们通过发出以下命令来创建一个名为aws-cognito-spa-demo的空应用程序:

 vue create aws-cognito-spa-demo 

系统将提示您选择插件

亚马逊Cognito

创建应用程序后,您可以导航到该目录并发出命令以运行该应用程序

 cd aws-cognito-spa-demo  npm instal  npm run serve 

您将在http:// localhost:8080运行该应用程序

安装其他依赖项

我们将安装用于该应用程序的必需节点软件包:

 npm install --save amazon-cognito-auth-js  npm install --save amazon-cognito-identity-js  npm install --save vue-router  npm install --save axios 

在Amazon Cognito中创建新的App Client

我们将通过Amazon Cognito控制台创建一个名为test-spa-client的新App客户test-spa-client ,如下所示:

亚马逊Cognito

通过提供回调URL,注销URL,允许的OAUth流和OAuth范围的值,导航到“应用程序客户端设置”以更新创建的客户端的设置:

亚马逊Cognito

我们使用隐式授予作为SPA应用程序的OAuth流。

创建环境变量

我们将与Amazon Cognito相关的设置存储在属性文件中,并且Vue CLI将在应用程序运行时使其在环境变量中可用。 在此处可以找到有关在Vue JS应用程序中定义环境变量的更多信息。

我们将在.env文件中存储通用的应用程序设置,例如cognito重定向URI,注销URI和.env一些本地设置。 .env。*。local和.env.local文件从git中被忽略。 因此,您不必将本地设置提交到版本控制。

 # In .env  VUE_APP_COGNITO_REDIRECT_URI=http: //localhost:8080/login/oauth2/code/cognito  VUE_APP_COGNITO_REDIRECT_URI_SIGNOUT=http: //localhost:8080/logout  VUE_APP_APP_URL=http: //localhost:8080 

然后是.env.local中的以下内容:

 VUE_APP_COGNITO_USERPOOL_ID=<cognito userpool id>  VUE_APP_COGNITO_APP_DOMAIN=<cognito app domain>  VUE_APP_COGNITO_CLIENT_ID=<app client id> 

创建用户信息存储

我们将使用全局JSON对象存储登录的用户信息。 这是使用Vuex的另一种方法。 让我们在src/app/user-info-store.js创建JSON对象:

 var state = { cognitoInfo: {}, loggedIn: false , loadingState: true , errorLoadingState: false  }  function setLoggedIn(newValue) { state.loggedIn = newValue;  }  function setLoggedOut() { state.loggedIn = false ; state.cognitoInfo = {};  }  function setCognitoInfo(newValue){ state.cognitoInfo = newValue;  }  export default { state: state, setLoggedIn: setLoggedIn, setLoggedOut: setLoggedOut, setCognitoInfo: setCognitoInfo  } 

Amazon Cognito API的包装

让我们为Amazon Cognito API创建包装器src/app/auth.js ,这将简化诸如构建CognitoAuth对象,登录和注销的操作:

 /* eslint-disable */  {CognitoAuth, StorageHelper} from 'amazon-cognito-auth-js' import {CognitoAuth, StorageHelper} from ;  IndexRouter from '../router/index' import IndexRouter from ;  UserInfoStore from './user-info-store' import UserInfoStore from ;  UserInfoApi from './user-info-api' import UserInfoApi from ;  const CLIENT_ID = process.env.VUE_APP_COGNITO_CLIENT_ID;  const APP_DOMAIN = process.env.VUE_APP_COGNITO_APP_DOMAIN;  const REDIRECT_URI = process.env.VUE_APP_COGNITO_REDIRECT_URI;  const USERPOOL_ID = process.env.VUE_APP_COGNITO_USERPOOL_ID;  const REDIRECT_URI_SIGNOUT = process.env.VUE_APP_COGNITO_REDIRECT_URI_SIGNOUT;  const APP_URL = process.env.VUE_APP_APP_URL;  var authData = { ClientId : CLIENT_ID, // Your client id here AppWebDomain : APP_DOMAIN, TokenScopesArray : [ 'openid' , 'email' ], RedirectUriSignIn : REDIRECT_URI, RedirectUriSignOut : REDIRECT_URI_SIGNOUT, UserPoolId : USERPOOL_ID,  }  var auth = new CognitoAuth(authData);  auth.userhandler = { onSuccess: function(result) { console.log( "On Success result" , result); UserInfoStore.setLoggedIn( true ); UserInfoApi.getUserInfo().then(response => { IndexRouter.push( '/' ); });                 }, onFailure: function(err) { UserInfoStore.setLoggedOut(); IndexRouter.go({ path: '/error' , query: { message: 'Login failed due to ' + err } }); 'Login failed due to ' + err } }); }  };  function getUserInfoStorageKey(){ var keyPrefix = 'CognitoIdentityServiceProvider.' + auth.getClientId(); var tokenUserName = auth.signInUserSession.getAccessToken().getUsername(); var userInfoKey = keyPrefix + '.' + tokenUserName + '.userInfo' ; return userInfoKey;  }  var storageHelper = new StorageHelper();  var storage = storageHelper.getStorage();  export default { auth: auth, login(){ auth.getSession(); }, logout(){ if (auth.isUserSignedIn()) { var userInfoKey = this .getUserInfoStorageKey(); auth.signOut(); storage.removeItem(userInfoKey); } }, getUserInfoStorageKey,  } 

从Amazon Cognito获取用户信息

身份验证之后,我们可以使用访问令牌来获取有关登录用户的信息。为此,我们必须向端点发出GET请求: https://<app domain>/oauth2/userInfo 。 我们在src/app/user-info.js创建了一个实用程序方法getUserInfo() ,如下所示:

 axios from 'axios' import axios from ;  auth from './auth' import auth from ;  export default { getUserInfo(){ var jwtToken = auth.auth.getSignInUserSession().getAccessToken().jwtToken; const USERINFO_URL = ' https:// ' +auth.auth.getAppWebDomain() + '/oauth2/userInfo' ; var requestData = { headers: { 'Authorization' : 'Bearer ' + jwtToken } } return axios.get(USERINFO_URL, requestData).then(response => { return response.data; }); }  } 

上面部分编写的Cognito包装器已使用此API。

创建Vue组件

让我们为以下目的创建一些Vue组件:

  • 显示已登录的用户信息
  • 显示注销成功
  • 错误处理组件

我们将使用Vue路由器将URL路径映射到Vue组件。 组件定义如下所示:

Home组件

 <template> <div class = "row" > <div class = "col" > <h3>Welcome, </h3> <div class = "alert alert-info" > {{userInfo}} </div> <router-link to= "/logout" > Logout </router-link> </div> </div>  </template>  <script>  UserInfoStore from '../app/user-info-store' import UserInfoStore from ;  export default { name: 'Home' , data: function() { return { userInfo: UserInfoStore.state.cognitoInfo } }  }  </script>  <style>  </style> 

LogoutSuccess组件:

 <template>  <div class = "row" > <div class = "col" > <h2>Logged Out successfully</h2> <router-link to= "/login" >Login</router-link> </div>  </div>  </template>  <script>  export default { mounted: function(){         }  }  </script> 

错误组件:

 <template> <div class = "alert alert-danger" > {{message}} </div>  </template>  <script>  export default { data: function(){ return { message: "" } }, mounted(){ this .message = this .$route.query.message; }  }  </script> 

设置路由器

如前一节所述,我们将使用Vue Router将URL路径映射到Vue组件。 我们将在router/index.js设置路由器配置,如下所示:

 /* eslint-disable */  Vue from 'vue' import Vue from  Router from 'vue-router' import Router from  Home from '@/components/Home' import Home from  auth from '../app/auth' import auth from ;  LogoutSuccess from '@/components/LogoutSuccess' import LogoutSuccess from ;  UserInfoStore from '../app/user-info-store' import UserInfoStore from ;  UserInfoApi from '../app/user-info-api' import UserInfoApi from ;  ErrorComponent from '@/components/Error' import ErrorComponent from ;  Vue.use(Router)  function requireAuth(to, from, next) {   if (!auth.auth.isUserSignedIn()) { UserInfoStore.setLoggedIn( false ); next({ path: '/login' , query: { redirect: to.fullPath } }); } else { UserInfoApi.getUserInfo().then(response => { UserInfoStore.setLoggedIn( true ); UserInfoStore.setCognitoInfo(response); next(); });       }  }  export default new Router({ mode: 'history' , base: '/' , routes: [ { path: '/' , name: 'Home' , component: Home, beforeEnter: requireAuth }, { path: '/login' , beforeEnter(to, from, next){ auth.auth.getSession(); } }, { path: '/login/oauth2/code/cognito' , beforeEnter(to, from, next){ var currUrl = window.location.href;         //console.log(currUrl); auth.auth.parseCognitoWebResponse(currUrl); //next(); } }, { path: '/logout' , component: LogoutSuccess, beforeEnter(to, from, next){ auth.logout(); next(); } }, { path: '/error' , component: ErrorComponent } ]  }) 

我们利用路由对象的beforeEnter属性添加渲染组件所需的所有先决条件。 然后在此属性中,检查用户是否使用我们创建的Cognito包装器登录。 因此,对于需要保护的路径,我们可以定义beforeEnter属性。

创建的默认应用程序具有一个App.vue组件,它将成为我们的根组件。 我们使用<router-view/>标记表示此处HTML将基于路由器配置中路径解析到的组件。

因此,我们的App.vue版本如下所示:

 <template> <div id= "app" > <img alt= "Vue logo" src= "./assets/logo.png" > <div class = "contents" > <router-view/> </div> </div>  </template>  <script>  export default { name: 'app'  }  </script>  <style>  #app { font-family: 'Avenir' , Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px;  }  </style> 

然后,我们更新src/main.js以引用包含路由器配置的目录,如下所示:

 Vue from 'vue' import Vue from  App from './App.vue' import App from  router from './router' import router from  Vue.config.productionTip = false  new Vue({ render: h => h(App), router  }).$mount( '#app' ) 

运行应用程序

您可以通过发出以下命令来运行该应用程序: npm run serve 。 导航到localhost:8080将带您进入Cognito登录屏幕:

亚马逊Cognito

输入您已在用户池中注册的用户的用户名和密码,甚至可以注册一个新用户。 登录后,您将被重定向回Vue JS应用:

亚马逊Cognito

注销链接将注销用户。

完整的代码可以在Github仓库中找到 。

翻译自: https://www.javacodegeeks.com/2019/04/amazon-cognito-single-page-application-vue.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神奇的压电效应

日常所用的电子打火机、石英表、扬声器、麦克风等都包含着压电晶体。 小时候有没有拿着这个东西电来玩啊&#xff1f;&#xff08;打火机的内胆&#xff09;今天我们就来聊聊压电效应。 这是一个打火机&#xff0c;拇指一按&#xff0c;产生压力&#xff0c;然后压电晶体产生…

光纤交换机使用方法及应用方案详解

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;它较普通交换机而言&#xff0c;采用了光纤电缆作为传输介质&#xff0c;光纤传输的优点是速度快、抗干扰能力强。那么&#xff0c;光纤交换机该如何使用呢&#xff1f;接下来我…

太阳能瓦片,古风与科技结合

中国发明的太阳能瓦片&#xff0c;古风与科技的结合&#xff0c;能省全年电费&#xff01; 今天视频的主角&#xff0c;是一种新型的柔性薄膜太阳能发电瓦—汉瓦。承载着东方古韵与中国浓厚的文化&#xff0c;将现代科技融入传统建筑&#xff0c;用尖端技术和精巧工艺&#xf…

在监控网络项目中该如何选择光纤交换机?

现在&#xff0c;随着网络技术的发展&#xff0c;在安防监控项目中&#xff0c;尤其是在远距离点位的监控中&#xff0c;我们经常会用到光纤收发器、光纤交换机。那么&#xff0c;我们在监控网络中该如何选择光纤交换机呢&#xff1f;接下来就跟随飞畅科技的小编一起来详细看看…

不一定了解的USB4.0

USB已经存在20多年了&#xff0c;从1996年推出USB1.0规范开始&#xff0c;经历USB1.1、2.0、3.0&#xff0c;再到如今的USB4.0&#xff0c;传输速率从1.5Mbps提升到80Gbps。 USB4协议于2019年发布&#xff0c;在硬件接口上&#xff0c;采用了Type-C的硬件接口&#xff0c;使用…

DNA存储技术—让信息保存万年

一个1亿年前的琥珀化石最近被发现了&#xff0c;中间封存着一只蚊子&#xff0c;假设这只蚊子的DNA中存储了1亿年前的地球数据&#xff0c;那么现在的人类将这些数据读取出来之后徐徐展开的是否就是1亿年前恐龙时代的壮美图景&#xff1f; 这是电影《侏罗纪公园》中的场景&…

2019年用于自动化的5个最佳Java测试框架

几十年来&#xff0c;Java一直是开发应用程序服务器端层的首选编程语言。 尽管JUnit一直在与开发人员一起帮助他们进行自动化的单元测试&#xff0c;但是随着时间的推移和测试的发展&#xff0c;当自动化测试不断增长时&#xff0c;已经开发了许多基于Java的开源框架&#xff0…

光纤交换机主要分为哪几类?

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;它较普通交换机而言&#xff0c;采用了光纤电缆作为传输介质。光纤传输的优点是速度快、抗干扰能力强。光纤交换机主要有两种&#xff0c;一是用来连接存储的FC交换机。另一种是…

你不了解的互联网暗网世界

看了真正的暗网&#xff0c;才知道电影里都是假的&#xff01;隐去一切身份信息&#xff0c;没有ID&#xff0c;没有名字&#xff0c;没有光和影......这就是暗网&#xff0c;无数人脑海里充斥着对它的丰富联想。在这里&#xff0c;FM人口&#xff0c;DP交易&#xff0c;ZZ争论…

运算放大器的基本电路符号

今天给大家介绍几种运放应用相关的电路。 这是运放的最基本的电路符号&#xff08;1&#xff09; 物联网应用一&#xff1a;放大器 1.反相放大器电路图&#xff08;2&#xff09; 2.同相放大器&#xff08;3&#xff09; 3.电压跟随器&#xff08;4&#xff09; 4.差分放…

工业交换机厂家有哪些,国产工业交换机品牌排行榜

近些年来&#xff0c;交换机在国内的应用很是广泛&#xff0c;但是工业交换机市场竞争异常激烈&#xff0c;光是国内光就应用很多专业生产研发交换机的厂家&#xff0c;在与国外交换机品牌的竞争中&#xff0c;国内的交换机品牌是越来越有本土的优势。那么&#xff0c;2021年国…

spring 异常捕获异常_使用Spring跟踪异常–第2部分–委托模式

spring 异常捕获异常在上一个博客中 &#xff0c;我开始谈论需要弄清您的应用程序在生产环境中是否行为异常。 我说过&#xff0c;监视应用程序的一种方法是检查其日志文件是否存在异常&#xff0c;如果发现异常&#xff0c;则采取适当的措施。 显然&#xff0c;日志文件可能会…

LoRa在智能家居当中的物联网应用

一、智能家居行业背景 原文地址&#xff1a;LoRa在智能家居当中的应用 2020年&#xff0c;中国智能家居进入AIoT赋能期&#xff0c;全面革新智能家居产品形态。从市场规模来看&#xff0c;2019年智能家居市场规模达到1530亿元左右&#xff0c;2020年将达1820亿元。从设备出货量…

飞畅科技-国内老牌工业以太网交换机品牌

现如今&#xff0c;随着中国制造2025和工业4.0的逐渐展开&#xff0c;工业交换机的市场越来越大&#xff0c;尤其是在电力&#xff0c;交通&#xff0c;及工业自动化行业&#xff0c;但是进口品牌的在国内的份额却在不断的萎缩&#xff0c;这就给国内的很多工业交换机厂家一个非…

物联网是什么?物联网的关键技术是什么?

物联网是从应用出发&#xff0c;利用互联网、无线通信网络资源进行业务信息的传送&#xff0c;是互联网、移动通信网应用的延伸&#xff0c;是自动化控制、遥控遥测及信息应用技术的综合体现。 信息革命浪潮。物联网已经在全世界得到了很大的重视&#xff0c;随着“物联网十二五…

通过Java Hipster升级Spring Security OAuth和JUnit测试

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 使用单元测试和集成测试来验证代码质量是一种很好的方式来表明您对代码的关心。 我最…

核心交换机与汇聚交换机的区别

核心交换机并不是交换机的一种类型&#xff0c;放在核心层(网络主干部分)的交换机叫核心交换机。汇聚层交换机&#xff0c;是多台接入层交换机的汇聚地点。汇聚层交换机和核心交换机在功能、特性、参数、场景等都是有所区别。接下来我们就详细介绍下核心交换机、汇聚交换机、普…

TCP服务器虚拟串口工具的MCGS开发调试教程

TCP服务器虚拟串口&#xff08;Modbus RTU&#xff09; 虚拟串口的方式不同&#xff0c;虚拟从机的连接方式也就不同&#xff0c;利用虚拟串口的TCP服务器模式虚拟串口1&#xff08;COM1&#xff09;如下&#xff1a; MCGS配置不用修改&#xff0c;只需配置仿真从机&#xff0…

虚拟串口工具MCGS开发调试的灵活应用教程

MCGS开发调试一般来说具有三种方式&#xff0c;如下所述&#xff1a; &#xff08;1&#xff09;选择使用模拟设备&#xff0c;一般来说无法直接在电脑上调试真实设备&#xff08;不带以太网型号&#xff09;&#xff0c;需要通过USB转485设备中转实现&#xff0c;在调试完成需…

工业级环网交换机是做什么的?

什么是环网交换机&#xff1a; 环网交换机是一种特殊的交换机&#xff0c;因为主流的环网交换机均为工业交换机&#xff0c;因此一般可以将其称为工业级环网交换机&#xff0c;环网交换在环网结构上有很多的优点&#xff0c;比如有冗余性、可靠性等。 环网交换机可以组建环形网…