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

cognito

在本文中,我们将研究使用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

cognito

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

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

相关文章

段描述符表(GDT+LDT)的有感

【0】写在前面 要知道&#xff0c;在汇编中&#xff0c;代码的装入顺序决定了在内存中的地址位置。所有的代码或者数据都在硬盘上&#xff0c;当调试或者启动的时候&#xff0c;加载到内存&#xff1b;当需要对数据进行处理的时候&#xff0c;我们通过将数据从内存载入到regis…

地理信息系统概论_地理信息系统概论黄杏元第3版配套练习题库——才聪学习网...

黄杏元《地理信息系统概论》(第3版)配套题库【考研真题精选&#xff0b;章节题库】一、选择题1完整的GIS主要由四个部分构成&#xff0c;即计算机硬件系统、计算机软件系统、(  )和系统管理操作人员。[杭州师范大学2018年研]A&#xff0e;网络B&#xff0e;用户C&#xff0e;…

PO/BO/VO/DTO/POJO/DAO/DO

文章目录DO&#xff08;Domain Object&#xff09;DO&#xff08;Data Object&#xff09;POVOBODTOPOJODAOJavaBeanEJBEntity应用程序的分层设计MVC业务分层阿里开发手册关于POJO类的命名规范总结参考文章DO&#xff08;Domain Object&#xff09; Domain Object&#xff0c;…

openshift_OpenShift Origin中的Kubernetes Spark运算符(第1部分)

openshift本系列有关Radanalytics.io的Kubernetes Spark运算符 OpenShift起源 。 它是一个开源的运营商来管理 Apache Spark集群和应用程序。 为了在OpenShift Origin上部署操作员&#xff0c;第一次需要为其克隆GitHub存储库&#xff1a; git clone https://github.com/rad…

小程序二级页面tabbar_小程序页面推广踩坑记

前几天&#xff0c;团队里有个小伙伴遇到一个问题&#xff0c;卡壳了大半天。我觉得这个例子值得拿出来分享给大家。希望大家以后遇到类似的问题能顺利绕过这种坑。业务场景很常见&#xff0c;就是为了配合小程序中特定页面的推广&#xff0c;区分推广渠道和人员&#xff0c;逐…

转移指令jmp和跳转指令call

【-1】写在前面 以下内容文字描述来自于 王爽老师的《汇编语言》教材&#xff0c;建议大家都买一本&#xff0c;哈哈。不是我打广告&#xff0c;确实人家写的好&#xff0c;应该支持。我只是附上了自己的图片和理解而已。 【0】先上干货 只修改ip&#xff0c;称为段内转移&a…

jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序

jmeter负载测试测试Apache JMeter是用于模拟Web应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求间隔来轻松地构建测试计划&#xff0c;然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时&#xff0c;您将获得一份性能摘要报告…

Windows下安装Nutch

Nutch安装 一、需求部份 a) Nutch是Java开发的所以需要下载Java JDK 下载地址http://java.sun.com/javase/downloads/index.jsp b) Nutch的演示搜索页面是Jsp的需要Tomcat做服务器 下载地址&#xff1a;http://jakarta.apache.org/tomcat/ c) Nutch的脚本都是用Linux的Shell写的…

python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程

以下脚本encrypt_me.py(modified from another post)使用gpg加密自身并以装甲形式打印出密文.但它只适用于python2.7但不适用于python3&#xff1f;你知道它在python3上运行时有什么问题吗&#xff1f;import subprocessimport shleximport osimport sysin_fd, out_fd os.pipe…

程序编码(机器级代码+汇编代码+C代码+反汇编)

【-1】相关声明 本文总结于csapp&#xff1b; 了解详情&#xff0c;或有兴趣&#xff0c;建议看原版书籍&#xff1b;【0】程序编码 GCC调用了一系列程序&#xff0c;将源代码转化成可执行代码的流程如下&#xff1a; &#xff08;1&#xff09;C预处理器扩展源代码&#xf…

angular1.2.27_Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

angular1.2.27“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 如果您已经成为Java开发人员超过15年&#xff0c;那么您可能还记得何时…

ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发

在知乎上看过不少大牛写的自动驾驶技术介绍文章&#xff0c;大多谈到的是AI, Deep Learning, Computer Vision等等感知(Perception)层面的。但在各个传感器(雷达、摄像头、激光雷达等)探测到目标信息及周围环境后&#xff0c;车辆该如何做出反应&#xff1f;自动驾驶的大脑该怎…

MyEclipse详细使用教程

第一部分MyEclipse的基本使用 一&#xff0e;提示&#xff1a;MyEclipse的透视图按钮&#xff1a;可以切换不同的透视图&#xff08;位于右上角&#xff09; 1.建立一个工程 ----File—new—project—选项含有Javaproject&#xff0c;webproject等等—输入工程名字如myproject&…

控制语句(if-else+循环+switch)汇编规则

【1】说说条件码 最常用的的条件码有&#xff1a; CF&#xff1a;进位标志 &#xff08;无符号溢出&#xff09;ZF&#xff1a;零标志SF&#xff1a;符号标志&#xff08;结果为负数&#xff09;OF&#xff1a;溢出标志 &#xff08;补码溢出&#xff0c; 有符号溢出&#xf…

zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

zxing qr区域判断在本文中&#xff0c;我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像。 QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.awt.image.BufferedImage对象&#xff1a; public static BufferedImage getQRCode(String …

审批流_怎样让审批工作流和应用数据分离?

在企业行政管理中&#xff0c;审批是最常遇到的场景。传统管理中&#xff0c;人们会有纸张审批&#xff0c;而现在市场上已有大量的线上审批软件&#xff0c;他们帮助企业完成审批电子化&#xff0c;审批速度更快&#xff0c;信息也能留档。然而大部分审批软件都不够灵活&#…

java 反射api_反射是最重要的Java API

java 反射api前几天我在想-这是最重要的Java API。 哪种SE和EE API可以使大多数Java生态系统成为可能&#xff0c;而哪些API不能重新创建为第三方库。 正如您可能已经猜到标题一样&#xff0c;我认为它是Reflection API 。 是的&#xff0c;它不可避免地是每个项目的直接或间接…

前端校验表单项内容是否合规的JS脚本代码

用途&#xff1a;校验ip地址的格式 输入&#xff1a;strIP&#xff1a;ip地址 返回&#xff1a;如果通过验证返回true,否则返回false&#xff1b; */ function isIP(strIP) { if (isNull(strIP)) return false; var re/^(\d).(\d).(\d).(\d)$/g //匹配IP地址的正则表达式 if(r…

过程(栈帧结构是干货)

【0】写在前面 过程&#xff08;栈帧结构是干货&#xff09;&#xff1b;本文总结于csapp&#xff0c; 加上自己的理解&#xff1b;【1】栈帧结构 每个函数的每次调用&#xff0c;都有它自己独立的一个栈帧&#xff0c;这个栈帧中维持着所需要的各种信息。 过程调用&#xf…

山东小学信息技术课本 python 五年级_山东教育出版社小学信息技术五年级上册教案 全册.doc...

山东教育出版社小学信息技术五年级上册教案 全册电子备课教学案学年度 第一学期学科 信息技术年级 五年级姓名教师个人备课情况统计一览表 项目?精备课二次备课课堂检测课后反思交流平台 篇数月份第( )月第( )月第( )月第( )月备注&#xff1a;为便于自查&#xff0c;此表由教…