Passer au contenu principal

Casdoor SDKs

Introduction

Comparé au protocole OIDC standard, Casdoor fournit plus de fonctionnalités dans son SDK, comme la gestion des utilisateurs, le téléchargement de ressources, etc. Se connecter à Casdoor via Casdoor SDK prend plus de temps que d'utiliser une bibliothèque cliente OIDC standard mais fournira la meilleure flexibilité et l'API la plus puissante.

Les SDK Casdoor peuvent être divisés en deux catégories :

  1. SDK Frontend : Comme le SDK Javascript, le SDK Vue pour les sites web, les SDK Android ou iOS pour les applications, etc. Casdoor prend en charge l'authentification pour les sites web et les applications mobiles.
  2. SDK Backend : SDK pour les langages backend comme Go, Java, Node.js, Python, PHP, etc.
conseil

Si votre site web est développé de manière séparée entre le frontend et le backend, alors vous pouvez utiliser le SDK Javascript : casdoor-js-sdk ou le SDK React : casdoor-react-sdk ou le SDK Vue : casdoor-vue-sdk pour intégrer Casdoor en frontend. Si votre application web est un site web traditionnel développé par JSP ou PHP, vous pouvez simplement utiliser uniquement les SDK backend. Voir un exemple : casdoor-python-vue-sdk-example

SDK MobileDescriptionCode SDKCode d'exemple
SDK AndroidPour les applications Androidcasdoor-android-sdkcasdoor-android-example
SDK iOSPour les applications iOScasdoor-ios-sdkcasdoor-ios-example
SDK React NativePour les applications React Nativecasdoor-react-native-sdkcasdoor-react-native-example
SDK FlutterPour les applications Fluttercasdoor-flutter-sdkcasdoor-flutter-example
SDK FirebasePour les applications Google Firebasecasdoor-firebase-example
SDK de jeux UnityPour les jeux PC/Mobile 2D/3D Unitycasdoor-dotnet-sdkcasdoor-unity-example
SDK uni-appPour les applications uni-appcasdoor-uniapp-sdkcasdoor-uniapp-example
SDK de bureauDescriptionCode SDKCode d'exemple
SDK ElectronPour les applications Electroncasdoor-js-sdkcasdoor-electron-example
SDK .NET de bureauPour les applications de bureau .NETcasdoor-dotnet-sdkWPF: casdoor-dotnet-desktop-example
WinForms: casdoor-dotnet-winform-example
Avalonia UI: casdoor-dotnet-avalonia-example
SDK C/C++Pour les applications de bureau C/C++casdoor-cpp-sdkcasdoor-cpp-qt-example
SDK de frontend WebDescriptionCode SDKCode d'exemple
SDK JavascriptPour les sites Web traditionnels non-SPAcasdoor-js-sdkBackend Nodejs : casdoor-raw-js-example
Backend Go : casdoor-go-react-sdk-example
SDK uniquement frontendPour les sites Web SPA uniquement frontendcasdoor-js-sdkcasdoor-react-only-example
SDK ReactPour les sites Web Reactcasdoor-react-sdkBackend Nodejs : casdoor-nodejs-react-example
Backend Java : casdoor-spring-security-react-example
SDK Next.jsPour les sites Web Next.jsnextjs-auth
SDK NuxtPour les sites Web Nuxtnuxt-auth
Vue SDKFor Vue websitescasdoor-vue-sdkcasdoor-python-vue-sdk-example
Angular SDKFor Angular websitescasdoor-angular-sdkcasdoor-nodejs-angular-example
Flutter SDKFor Flutter Web websitescasdoor-flutter-sdkcasdoor-flutter-example
ASP.NET SDKFor ASP.NET Blazor WASM websitesBlazor.BFF.OpenIDConnect.Templatecasdoor-dotnet-blazorwasm-oidc-example
Firebase SDKFor Google Firebase appscasdoor-firebase-example

Ensuite, utilisez l'un des SDK backend suivants en fonction du langage de votre backend :

SDK de backend WebDescriptionCode du SDKCode d'exemple
SDK GoPour les backends Gocasdoor-go-sdkcasdoor-go-react-sdk-example
SDK JavaPour les backends Javacasdoor-java-sdkcasdoor-spring-boot-starter, casdoor-spring-boot-example, casdoor-spring-security-react-example
SDK Node.jsPour les backends Node.jscasdoor-nodejs-sdkcasdoor-nodejs-react-example
SDK PythonPour les backends Pythoncasdoor-python-sdkFlask: casdoor-python-vue-sdk-example
Django: casdoor-django-js-sdk-example
FastAPI: casdoor-fastapi-js-sdk-example
SDK PHPPour les backends PHPcasdoor-php-sdkwordpress-casdoor-plugin
SDK .NETPour les backends ASP.NETcasdoor-dotnet-sdkcasdoor-dotnet-sdk-example
SDK RustPour les backends Rustcasdoor-rust-sdkcasdoor-rust-example
SDK C/C++Pour les backends C/C++casdoor-cpp-sdkcasdoor-cpp-qt-example
SDK DartPour les backends Dartcasdoor-dart-sdk
SDK RubyPour les backends Rubycasdoor-ruby-sdk

Pour une liste complète des SDK Casdoor officiels, veuillez voir : https://github.com/orgs/casdoor/repositories?q=sdk&type=all&language=&sort=

Comment utiliser le SDK Casdoor ?

1. Configuration du SDK Backend

Lorsque votre application démarre, vous devez initialiser la configuration du SDK Casdoor en appelant la fonction InitConfig() avec les paramètres requis. Prenez casdoor-go-sdk comme exemple : https://github.com/casbin/casnode/blob/6d4c55f5c9a3c4bd8c85f2493abad3553b9c7ac0/controllers/account.go#L51-L64

var CasdoorEndpoint = "https://door.casdoor.com"
var ClientId = "541738959670d221d59d"
var ClientSecret = "66863369a64a5863827cf949bab70ed560ba24bf"
var CasdoorOrganization = "casbin"
var CasdoorApplication = "app-casnode"

//go:embed token_jwt_key.pem
var JwtPublicKey string

func init() {
auth.InitConfig(CasdoorEndpoint, ClientId, ClientSecret, JwtPublicKey, CasdoorOrganization, CasdoorApplication)
}

Tous les paramètres pour InitConfig() sont expliqués comme suit :

ParamètreDoitDescription
point de terminaisonOuiURL du serveur Casdoor, comme https://door.casdoor.com ou http://localhost:8000
clientIdOuiID client pour l'application Casdoor
clientSecretOuiSecret client pour l'application Casdoor
jwtPublicKeyOuiLa clé publique pour le certificat de l'application Casdoor
organizationNameOuiLe nom de l'organisation Casdoor
applicationNameNonLe nom de l'application Casdoor
conseil

Le jwtPublicKey peut être géré dans la page Certs comme ci-dessous.

Gestion des certificats

Vous pouvez trouver la clé publique dans la page d'édition du certificat, la copier ou la télécharger pour le sdk.

Édition des certificats

Ensuite, vous pouvez sélectionner le certificat dans la page d'édition de l'application.

Sélection des certificats

2. Configuration Frontend

Tout d'abord, installez casdoor-js-sdk via NPM ou Yarn :

npm install casdoor-js-sdk

Ou :

yarn add casdoor-js-sdk

Ensuite, définissez les fonctions utilitaires suivantes (de préférence dans un fichier JS global comme Setting.js) :

import Sdk from "casdoor-js-sdk";

export function initCasdoorSdk(config) {
CasdoorSdk = new Sdk(config);
}

export function getSignupUrl() {
return CasdoorSdk.getSignupUrl();
}

export function getSigninUrl() {
return CasdoorSdk.getSigninUrl();
}

export function getUserProfileUrl(userName, account) {
return CasdoorSdk.getUserProfileUrl(userName, account);
}

export function getMyProfileUrl(account) {
return CasdoorSdk.getMyProfileUrl(account);
}

export function getMyResourcesUrl(account) {
return CasdoorSdk.getMyProfileUrl(account).replace("/account?", "/resources?");
}

export function signin() {
return CasdoorSdk.signin(ServerUrl);
}

export function showMessage(type, text) {
if (type === "") {
return;
} else if (type === "success") {
message.success(text);
} else if (type === "error") {
message.error(text);
}
}

export function goToLink(link) {
window.location.href = link;
}

Dans le fichier d'entrée de votre code frontend (comme index.js ou app.js dans React), vous devez initialiser le casdoor-js-sdk en appelant la fonction InitConfig() avec les paramètres requis. Les 4 premiers paramètres doivent utiliser la même valeur que le SDK backend Casdoor. Le dernier paramètre redirectPath est le chemin relatif pour l'URL redirigée, retournée par la page de connexion de Casdoor.

const config = {
serverUrl: "https://door.casdoor.com",
clientId: "014ae4bd048734ca2dea",
organizationName: "casbin",
appName: "app-casnode",
redirectPath: "/callback",
};

xxx.initCasdoorSdk(config);

(Optionnel) Parce que nous utilisons React comme exemple, notre chemin /callback atteint la route React. Nous utilisons le composant React suivant pour recevoir l'appel /callback et l'envoyer au backend. Vous pouvez ignorer cette étape si vous redirigez directement vers le backend (comme dans JSP ou PHP).

import React from "react";
import {Button, Result, Spin} from "antd";
import {withRouter} from "react-router-dom";
import * as Setting from "./Setting";

class AuthCallback extends React.Component {
constructor(props) {
super(props);
this.state = {
classes: props,
msg: null,
};
}

componentWillMount() {
this.login();
}

login() {
Setting.signin().then((res) => {
if (res.status === "ok") {
Setting.showMessage("success", `Logged in successfully`);
Setting.goToLink("/");
} else {
this.setState({
msg: res.msg,
});
}
});
}

render() {
return (
<div style={{textAlign: "center"}}>
{this.state.msg === null ? (
<Spin
size="large"
tip="Signing in..."
style={{paddingTop: "10%"}}
/>
) : (
<div style={{display: "inline"}}>
<Result
status="error"
title="Login Error"
subTitle={this.state.msg}
extra={[
<Button type="primary" key="details">
Details
</Button>,
<Button key="help">Help</Button>,
]}
/>
</div>
)}
</div>
);
}
}

export default withRouter(AuthCallback);

3. Obtenir les URL de connexion

Ensuite, vous pouvez montrer les boutons ou liens "S'inscrire" et "Se connecter" à vos utilisateurs. Les URL peuvent être récupérées soit dans le frontend soit dans le backend. Voir plus de détails à : /docs/basic/core-concepts#login-urls

4. Obtenir et vérifier le jeton d'accès

Voici les étapes :

  1. L'utilisateur clique sur l'URL de connexion et est redirigé vers la page de connexion de Casdoor, comme : https://door.casdoor.com/login/oauth/authorize?client_id=014ae4bd048734ca2dea&response_type=code&redirect_uri=https%3A%2F%2Fforum.casbin.com%2Fcallback&scope=read&state=app-casnode
  2. L'utilisateur entre le nom d'utilisateur et le mot de passe et clique sur Sign In (ou clique simplement sur le bouton de connexion tiers comme Sign in with GitHub).
  3. L'utilisateur est redirigé vers votre application avec le code d'autorisation émis par Casdoor (comme : https://forum.casbin.com?code=xxx&state=yyy), le backend de votre application doit échanger le code d'autorisation avec le jeton d'accès et vérifier que le jeton d'accès est valide et émis par Casdoor. Les fonctions GetOAuthToken() et ParseJwtToken() sont fournies par le SDK backend Casdoor.

Le code suivant montre comment obtenir et vérifier le jeton d'accès. Pour un exemple réel de Casnode (un site web de forum écrit en Go), voir : https://github.com/casbin/casnode/blob/6d4c55f5c9a3c4bd8c85f2493abad3553b9c7ac0/controllers/account.go#L51-L64

// get code and state from the GET parameters of the redirected URL
code := c.Input().Get("code")
state := c.Input().Get("state")

// exchange the access token with code and state
token, err := auth.GetOAuthToken(code, state)
if err != nil {
panic(err)
}

// verify the access token
claims, err := auth.ParseJwtToken(token.AccessToken)
if err != nil {
panic(err)
}

Si ParseJwtToken() se termine sans erreur, alors l'utilisateur s'est connecté avec succès à l'application. Les claims retournés peuvent être utilisés pour identifier l'utilisateur plus tard.

4. Identifier l'utilisateur avec le jeton d'accès

info

Cette partie est en fait la propre logique métier de votre application et ne fait pas partie d'OIDC, OAuth ou Casdoor. Nous fournissons juste de bonnes pratiques car beaucoup de gens ne savent pas quoi faire pour l'étape suivante.

Dans Casdoor, le jeton d'accès est généralement identique au jeton ID. Ce sont la même chose. Ainsi, le jeton d'accès contient toutes les informations pour l'utilisateur connecté.

La variable claims retournée par ParseJwtToken() est définie comme :

type Claims struct {
User
AccessToken string `json:"accessToken"`
jwt.RegisteredClaims
}
  1. User : l'objet Utilisateur, contenant toutes les informations pour l'utilisateur connecté, voir la définition à : /docs/basic/core-concepts#user
  2. AccessToken : la chaîne de jeton d'accès.
  3. jwt.RegisteredClaims : certaines autres valeurs requises par JWT.

À ce moment, l'application a généralement deux façons de se souvenir de la session utilisateur : session et JWT.

Session

La méthode pour définir la session varie grandement en fonction du langage et du framework web. Par exemple, Casnode utilise le framework web Beego et définit la session en appelant : c.SetSessionUser().

token, err := auth.GetOAuthToken(code, state)
if err != nil {
panic(err)
}

claims, err := auth.ParseJwtToken(token.AccessToken)
if err != nil {
panic(err)
}

claims.AccessToken = token.AccessToken
c.SetSessionUser(claims) // set session

JWT

Le accessToken retourné par Casdoor est en fait un JWT. Donc, si votre application utilise JWT pour conserver la session utilisateur, utilisez simplement le jeton d'accès directement pour cela :

  1. Envoyez le jeton d'accès au frontend, sauvegardez-le dans des endroits comme localStorage du navigateur.
  2. Laissez le navigateur envoyer le jeton d'accès au backend pour chaque requête.
  3. Appelez ParseJwtToken() ou votre propre fonction pour vérifier le jeton d'accès et obtenir les informations de l'utilisateur connecté dans votre backend.

5. (Optionnel) Interagir avec la table des utilisateurs

info

Cette partie est fournie par Casdoor Public API et ne fait pas partie de l'OIDC ou de l'OAuth.

Casdoor Backend SDK fournit beaucoup de fonctions d'aide, non limitées à :

  • GetUser(name string) : obtenir un utilisateur par nom d'utilisateur.
  • GetUsers() : obtenir tous les utilisateurs.
  • AddUser() : ajouter un utilisateur.
  • UpdateUser() : mettre à jour un utilisateur.
  • DeleteUser() : supprimer un utilisateur.
  • CheckUserPassword(auth.User) : vérifier le mot de passe de l'utilisateur.

Ces fonctions sont implémentées en effectuant des appels RESTful contre Casdoor Public API. Si une fonction n'est pas fournie dans Casdoor Backend SDK, vous pouvez effectuer des appels RESTful par vous-même.