以前文章講到如何使用Node.js+Express構建JavaScript客戶端,實現先後端分離。本節將介紹如何使用Vue實現先後端分離,文中介紹Vue的知識比較基礎,適合新手學習。html
前提條件:安裝nodejs、webpack和vue-cli。這個網上不少教程,這裏很少說。vue
(1)新建Vue項目node
Cmd進入建立項目的路徑,輸入:vue init webpack VueJS_Clientwebpack
新建vuejs_client的Vue項目,安裝npm。git
(2)安裝oidc-client庫github
使用VSCode打開vuejs_client項目所在的文件夾web
Ctrl + ~ 打開控制控制檯,輸入:npm install oidc-clientvue-cli
(3)實現自動跳轉登陸頁面npm
在src文件夾中打開HelloWorld.vue文件,導入oidc-client模塊,若在未登陸狀況,在組件建立前跳轉登陸頁面。代碼很簡單,直接調用登陸函數。後端
<template></template> <script> import Oidc from "oidc-client"; var config = { authority: "http://localhost:5000", client_id: "js", redirect_uri: "http://localhost:5003/CallBack", response_type: "id_token token", scope: "openid profile api1", post_logout_redirect_uri: "http://localhost:5003/" }; var mgr = new Oidc.UserManager(config); export default { beforeCreate() { mgr.signinRedirect(); } }; </script>
(4)指定重定向頁面
能夠看到上面的配置,一旦用戶登陸到IdentityServer,CallBack就是指定的redirect_uri頁面。
在components文件夾中新建CallBack.vue文件,調用UserManager函數,實現頁面跳轉。
<template> </template> <script> import Oidc from "oidc-client"; new Oidc.UserManager() .signinRedirectCallback() .then(function() { window.location = "/#/Home"; }) .catch(function(e) { }); export default{} </script>
(5)編寫Home組件
在CallBack中,重定向了Home組件,此時能夠獲取到登陸用戶的屬性和調用接口所需的access_token等。
<template> <div> <button @click="api">調用API</button> <button @click="logout">退出登陸</button> <pre>{{res}}</pre> </div> </template> <script> import Oidc from "oidc-client"; var config = { authority: "http://localhost:5000", client_id: "js", redirect_uri: "http://localhost:5003/CallBack", response_type: "id_token token", scope: "openid profile api1", post_logout_redirect_uri: "http://localhost:5003/" }; var mgr = new Oidc.UserManager(config); export default { name: "Home", data() { return { res: "My Home" }; }, methods: { api() { var that=this; mgr.getUser().then(function(user) { var url = "http://localhost:5001/identity"; var xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.onload = function() { that.res = (xhr.status, JSON.parse(xhr.responseText)) }; xhr.setRequestHeader("Authorization", "Bearer " + user.access_token); xhr.send(); }); }, logout() { mgr.signoutRedirect(); } }, mounted() { var that=this; mgr.getUser().then(function(user) { if (user) { // this.res = ("User logged in", user.profile);注意閉包 that.res = ("User logged in", user.profile); } else { that.res = ("User not logged in"); } }); } }; </script> <style scoped> </style>
(6)最後,在Router中添加新建的路由並修改程序啓動端口爲5003
(1)修改受權服務配置
在AuthServer項目,打開Config.cs文件,在GetClients中添加JavaScript客戶端配置
// JavaScript Client new Client { ClientId = "js", ClientName = "JavaScript Client", AllowedGrantTypes = GrantTypes.Implicit, AllowAccessTokensViaBrowser = true, RedirectUris = { "http://localhost:5003/CallBack" }, PostLogoutRedirectUris = { "http://localhost:5003 " }, AllowedCorsOrigins = { "http://localhost:5003" }, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "api1" }, }
(2)在資源服務配置容許跨域調用api
在ResourceAPI項目,打開Startup.cs文件中的ConfigureServices方法,配置CORS,容許Ajax調用從http://localhost:5003調用http://localhost:5001的Web API。
//JS-allow Ajax calls to be made from http://localhost:5003 to http://localhost:5001. services.AddCors(options => { //this defines a CORS policy called "default" options.AddPolicy("default", policy => { policy.WithOrigins("http://localhost:5003") .AllowAnyHeader() .AllowAnyMethod(); }); });
在Configure方法中將CORS中間件添加到管道中
//JS-Add the CORS middleware to the pipeline in Configure: app.UseCors("default");
(3)添加測試用的api接口
添加IdentityController控制器
[Route("[controller]")] public class IdentityController : ControllerBase { [Authorize(Roles ="admin")] [HttpGet] public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value }); } }
(4)測試
運行AuthServer項目,運行ResourceAPI項目。
在VSCode終端輸入:npm run dev
打開瀏覽器:http://localhost:5003/ 自動跳轉到登陸頁面
帳號:zhubingjian 密碼:123 登陸。跳轉到Home頁面並獲取到用戶的屬性信息。
調用API,知足受權條件,成功獲取數據。
本節代碼儘可能簡單化了,並有加太多東西進去。關於IdentityServer4的相關知識和教程,能夠看我前面幾篇博客,都有詳細的教程。
受權服務和資源服務源碼地址: https://github.com/Bingjian-Zhu/Mvc-HybridFlow.git
Vue Demo源碼地址:https://github.com/Bingjian-Zhu/Identity_Vue_Client