@idbase/idbase-vue
v5.8.14
Published
Vue support for Idbase
Downloads
11
Readme
Idbase Vue SDK
Idbase Vue version 4+ is for Vue 3 and Vue Router 4. If you are looking for @idbase/[email protected] which supports Vue 2, please checkout the master branch.
Idbase Vue SDK builds on top of the Idbase Auth SDK. This SDK integrates with the vue-router and extends the [Vue prototype][] with an Idbase Auth SDK instance to help you quickly add authentication and authorization to your Vue single-page web application.
With the Idbase Auth SDK, you can:
- Login and logout from Idbase using the OAuth 2.0 API
- Retrieve user information
- Determine authentication status
- Validate the current user's session
All of these features are supported by this SDK. Additionally, using this SDK, you can:
- Add "protected" routes, which will require authentication before render
- Add an instance of the Idbase Auth SDK to Vue app's global instance by attaching them to globalProperties.
- Inject reactive authState property to your Vue components
This SDK does not provide any UI components.
This SDK does not currently support Server Side Rendering (SSR)
This library currently supports:
Release Status
:heavy_check_mark: The current stable major version series is: 5.x
| Version | Status |
| ------- | -------------------------------- |
| 5.x
| :heavy_check_mark: Stable |
| 4.x
| :heavy_check_mark: Stable |
| 3.x
| :x: Retired |
| 2.x
| :x: Retired |
| 1.x
| :x: Retired |
Getting Started
- If you do not already have a Developer Edition Account, you can create one at https://developer.idbase.com.cn/signup/.
- An Idbase Application, configured for Single-Page App (SPA) mode. This is done from the Idbase Developer Console and you can find instructions here. When following the wizard, use the default properties. They are are designed to work with our sample applications.
Helpful Links
- Vue CLI
- If you don't have a Vue app, or are new to Vue, please start with this guide. It will walk you through the creation of a Vue app, creating routers, and other application development essentials.
- Idbase Sample Application
- A fully functional sample application.
- Idbase Guide: Sign users into your single-page application
- Step-by-step guide to integrating an existing Vue application with Idbase login.
- Strategies for Obtaining Tokens
- Idbase Vue SDK supports
hash
andhistory
router modes. For more details For more details, see Strategies for Obtaining Tokens
- Idbase Vue SDK supports
Installation
This library is available through npm. To install it, simply add it to your project:
npm install --save @idbase/idbase-vue
Configuration
You will need the values from the OIDC client that you created in the previous step to instantiate the middleware. You will also need to know your Idbase Org URL, which you can see on the home page of the Idbase Developer console.
In your application's vue-router configuration, import the @idbase/idbase-vue
plugin and pass it your OpenID Connect client information:
// main.ts
import { createApp } from 'vue'
import { IdbaseAuth } from '@idbase/idbase-auth'
import IdbaseVue from '@idbase/idbase-vue'
const idbaseAuth = new IdbaseAuth({
issuer: 'https://{yourIdbaseDomain}',
clientId: '{clientId}',
redirectUri: window.location.origin + '/login/callback',
scopes: ['openid', 'profile', 'email']
})
const app = createApp(App)
app.use(IdbaseVue, { idbaseAuth })
app.mount('#app')
Use the LoginCallback Component
In order to handle the redirect back from Idbase, your app will need to read the values returned from Idbase and exchange them for tokens. This SDK provides a LoginCallback component which calls $auth.handleLoginRedirect to perform this logic. If an error occurs, it will be displayed by the LoginCallback component, named slot (error
) can be provided to customize the error rendering logic. For custom behavior, the LoginCallback component file can be copied to your own source tree and modified as needed.
Note: Make sure you have the login redirect URI (as an absolute URL) listed in your Idbase App's configuration in the Idbase Admin console.
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import { LoginCallback } from '@idbase/idbase-vue'
const router = createRouter({
...
history: createWebHistory(process.env.BASE_URL),
routes: [
{ path: '/login/callback', component: LoginCallback },
...
]
})
Add a Protected Route
Route is protected when the requiresAuth
metadata is added in the configuration, which allows access only if authState.isAuthenticated is true. By default, authState.isAuthenticated is true if both accessToken
and idToken
are valid, but this behavior can be customized by defining a custom isAuthenticated function.
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import { ssoAuthorize } from '@idbase/idbase-vue'
import Protected from '../components/Protected'
const router = createRouter({
...
history: createWebHistory(process.env.BASE_URL),
routes: [
{
path: '/protected',
component: Protected,
meta: {
requiresAuth: true
}
}
...
]
})
// Due to navigation guards mixin issue in vue-router-next, navigation guard logic need to be added manually
router.beforeEach(ssoAuthorize)
Note: Vue router navigation guards mixin issue is mentioned here. GitHub issue is tracked here
If a user does not have a valid session, then a new authorization flow will begin. By default, they will be redirected to the Idbase Login Page for authentication. Once authenticated, they will be redirected back to your application's protected page. This logic can be customized by setting an onAuthRequired function on the config object.
Show Login and Logout Buttons
In the relevant location in your application, you will want to provide Login
and Logout
buttons for the user. You can show/hide the correct button by using the injected reactive authState property. For example:
// src/App.vue
<template>
<div id="app">
<router-link to="/" tag="button" id='home-button'> Home </router-link>
<button v-if='authState && authState.isAuthenticated' v-on:click='logout' id='logout-button'> Logout </button>
<button v-else v-on:click='login' id='login-button'> Login </button>
<router-view/>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'app',
methods: {
async login () {
await this.$auth.signInWithRedirect()
},
async logout () {
await this.$auth.signOut()
}
}
})
</script>
If you are using setup function or setup script, you can access the IdbaseAuth instance with useAuth
composable.
// src/App.vue
<template>
<div id="app">
<router-link to="/" tag="button" id='home-button'> Home </router-link>
<button v-if='authState && authState.isAuthenticated' v-on:click='logout' id='logout-button'> Logout </button>
<button v-else v-on:click='login' id='login-button'> Login </button>
<router-view/>
</div>
</template>
<script setup lang="ts">
import { useAuth } from '@idbase/idbase-vue';
const auth = useAuth();
const login = async () => {
await auth.signInWithRedirect()
}
const logout = async () => {
await auth.signOut()
}
</script>
Use the Access Token
When your users are authenticated, your Vue application has an access token that was issued by your Idbase Authorization server. You can use this token to authenticate requests for resources on your server or API. As a hypothetical example, let's say you have an API that provides messages for a user. You could create a MessageList
component that gets the access token and uses it to make an authenticated request to your server.
Here is what the Vue component could look like for this hypothentical example using axios:
// src/components/MessageList.vue
<template>
<ul v-if="posts && posts.length">
<li v-for="post in posts" :key='post.title'>
<p><strong>{{post.title}}</strong></p>
<p>{{post.body}}</p>
</li>
</ul>
</template>
<script>
import axios from 'axios'
export default {
data () {
return {
posts: []
}
},
async created () {
axios.defaults.headers.common['Authorization'] = `Bearer ${this.$auth.getAccessToken()}`
try {
const response = await axios.get(`http://localhost:{serverPort}/api/messages`)
this.posts = response.data
} catch (e) {
console.error(`Errors! ${e}`)
}
}
}
</script>
Using a custom login-page
The Idbase-vue
SDK supports the session token redirect flow for custom login pages. For more information, see the basic Idbase Sign-in Widget functionality.
To implement a custom login page, set an onAuthRequired callback on the IdbaseConfig object:
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes: [
// other routes ...
{ path: '/login', component: Login }
]
})
export default router
// main.ts
import { createApp } from 'vue'
import { IdbaseAuth } from '@idbase/idbase-auth'
import IdbaseVue from '@idbase/idbase-vue'
import router from './router'
const idbaseAuth = new IdbaseAuth(/* config */)
const app = createApp(App)
app.use(router)
app.use(IdbaseVue, {
idbaseAuth,
onAuthRequired: (IdbaseAuth) => {
router.push({ path: '/login' })
}
})
app.mount('#app')
Resuming the authentication flow
When using a custom login page and an external identity provider your app should be prepared to handle a redirect callback from Idbase to resume the authentication flow. The LoginCallback component has built-in logic for this scenario.
The redirectUri
of your application will be requested with a special parameter (?error=interaction_required
) to indicate that the authentication flow should be resumed by the application. In this case, the LoginCallback will call the onAuthResume function (if defined). If onAuthResume
is not defined, then onAuthRequired
will be called (if defined). If neither method is defined, then the LoginCallback component will display theinteraction_required
error as a string.
If the authentication flow began on the custom login page using the Idbase SignIn Widget, the transaction will automatically resume when the widget is rendered again on the custom login page.
Note that onAuthResume
has the same signature as onAuthRequired
. If you do not need any special logic for resuming an authorization flow, you can define only an onAuthRequired
method and it will be called both to start or resume an auth flow.
Reference
$auth
This SDK works as a Vue Plugin. It provides an instance of the Idbase Auth SDK to your components on the globalProperties. You can access the Idbase Auth SDK instance by using this.$auth
in your components.
LoginCallback
LoginCallback
handles the callback after the redirect to and back from the Idbase-hosted login page. By default, it parses the tokens from the uri, stores them, then redirects to /
. If a secure route caused the redirect, then the callback redirects to the secured route. For more advanced cases, this component can be copied to your own source tree and modified as needed.
Configuration Options
The base set of configuration options are defined by Idbase Auth SDK. The following properties are required:
issuer
(required): The OpenID Connectissuer
clientId
(required): The OpenID Connectclient_id
redirectUri
(required): Where the callback is hosted
This SDK accepts all configuration options defined by Idbase Auth SDK (see Configuration Reference for the supported options) and adds some additional options:
onAuthRequired
(optional) Callback function. Called when authentication is required. If not supplied, Idbase-vue
will redirect directly to Idbase for authentication. This is triggered when a secure route is accessed without authentication. A common use case for this callback is to redirect users to a custom login route when authentication is required for a SecureRoute.
See Using a custom login-page for the code sample.
onAuthResume
(optional): Callback function. Only relevant if using a custom login page. Called when the authentication flow should be resumed by the application, typically as a result of redirect callback from an external identity provider. If onAuthResume
is not defined, onAuthRequired
will be called instead.
Usage with TypeScript
Use types
Types are implicitly provided by this library through the types entry in package.json. Types can also be referenced explicitly by importing them.
import { IdbaseVueOptions } from '@idbase/idbase-vue'
import { IdbaseAuth } from '@idbase/idbase-auth'
const idbaseAuth = new IdbaseAuth(/* configs */)
const options: IdbaseVueOptions = {
idbaseAuth
}
Migrating
Each major version release introduces breaking changes, see MIGRATING GUIDE to get your application properly updated.
Contributing
We welcome contributions to all of our open-source packages. Please see the contribution guide to understand how to structure a contribution.
Installing dependencies for contributions
We use yarn for dependency management when developing this package:
yarn install
Commands
| Command | Description |
| -------------- | ---------------------------------- |
| yarn install
| Install all dependencies |
| yarn start
| Start the sample app using the SDK |
| yarn test
| Run integration tests |
| yarn lint
| Run eslint linting tests |