前端directus对接单点登录
只负责前端对接已经在direcuts中设置的单点登录,不考虑如何在direcuts设置单点登录
导入directus的sdk,调用封装好的登录、登出、及刷新方法。
directus.ts
import {Directus} from '@directus/sdk';
const directus = new Directus('directusUrl');
export async function login(email: string, password: string) {
let flag = false;
await directus.auth
.login({email, password})
.then((res) => {
if (typeof res.access_token !== 'undefined') {
flag = true;
}
})
return flag;
}
export async function refreshtoken() {
await directus.auth.refresh();
console.log(' >================(directus.ts:23)', 'fresh token');
}
export async function logout() {
await directus.auth.logout();
}
export async function userinfo() {
const userInfo = await directus.users.me.read();
return userInfo
}
setInterval(() => {
refreshtoken()
}, 600000)
/router/index.ts 添加路由守卫
// 路由守卫
Router.beforeEach((to) => {
const endtime: string | null = LocalStorage.getItem('auth_expires_at')
if (tools.checkexpires(typeof endtime === 'string' ? endtime : '')) {
console.log(' >================(index.ts:42)', 11);
return {name: 'login'}
}
const isAuthentication = LocalStorage.getItem('auth_token')
if (isAuthentication == null && to.name !== 'login' && to.name !== 'callback') {
return {name: 'login'}
}
});
checkexpires()
//时间戳判断
static checkexpires(endtime: string) {
if (endtime === '') {
return true
}
const now = (new Date()).getTime()
if (String(now) < endtime) {
return false
} else {
console.log(' >================now,endtime(tools.ts:61)', now, endtime);
refreshtoken()
return true
}
登录页
- 可以加一个form表单实现原生directus登录
<template>
<form>
<div class="col-3 q-col-gutter-y-md q-pt-xl">
<q-input v-model="email" type="email" label="邮箱" outlined/>
</div>
<div class="col-3 q-gutter-md">
<q-input v-model="password" type="password" label="密码" outlined/>
</div>
</form>
</template>
<script>
const email = ref('')
const password = ref('')
function checkLogin() {
login(email.value, password.value).then((r) => {
if (r) {
router.push({
path: '/'
})
}
})
}
</script>
单点登录跳转只需添加一个超链接,配置好redirect参数即可
<q-btn class="btn-fixed-width" flat label="OPENID登录" style="background:#112234;color:#fff;" :href='openidurl'></q-btn> const openidurl = `https://material-api.dev.supercomputing.link/auth/login/openid?redirect=${window.location.origin}/Oidc/callback`CallBack.vue
<template> <q-page> <div class="fixed-center text-center"> <p> <!-- <q-icon name="person" size="8em" color="grey-5" /> --> <q-circular-progress indeterminate size="100px" :thickness="0.22" color="primary" track-color="grey-3" class="q-ma-md" /> </p> <p class="text-body2 text-weight-regular">正在登录,请稍候...</p> <p></p> </div> </q-page> </template> <script lang="ts"> import {defineComponent, onMounted} from 'vue'; import {refreshtoken,} from 'src/service/directus'; export default defineComponent({ setup() { onMounted(async () => { await refreshtoken().then(() => { window.location.href = window.location.origin + '/project'; }) }); }, }); </script>
版权声明:本文为weixin_43815091原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。