Pular para o conteúdo principal

SDKs Casdoor

Visão Geral​

Casdoor SDKs extend standard OIDC with user management, resource uploads, and other features. They take a bit more setup than a generic OIDC client but give you the full Casdoor API.

Frontend SDKs — For web (JavaScript, React, Vue, etc.) and mobile (Android, iOS, React Native, Flutter).
Backend SDKs — For Go, Java, Node.js, Python, PHP, .NET, Rust, C++, and more.

dica

For a frontend/backend split, use a frontend SDK (e.g. casdoor-js-sdk, casdoor-react-sdk, casdoor-vue-sdk) in the UI and a backend SDK for token validation and API calls. For a traditional server-rendered app (JSP, PHP), a backend SDK may be enough. Example: casdoor-python-vue-sdk-example.

SDK MóvelDescriçãoCódigo do SDKCódigo de exemplo
SDK AndroidPara aplicativos Androidcasdoor-android-sdkcasdoor-android-example
SDK iOSPara aplicativos iOScasdoor-ios-sdkcasdoor-ios-example
SDK para React NativePara aplicativos React Nativecasdoor-react-native-sdkcasdoor-react-native-example
SDK FlutterPara aplicativos Fluttercasdoor-flutter-sdkcasdoor-flutter-example
SDK para FirebasePara aplicativos Google Firebasecasdoor-firebase-example
SDK para Jogos UnityPara jogos Unity 2D/3D PC/Mobilecasdoor-dotnet-sdkcasdoor-unity-example
SDK para uni-appPara aplicativos uni-appcasdoor-uniapp-sdkcasdoor-uniapp-example
dica

Mobile apps that sign users in natively instead of in a browser can use the Verification Code grant for SMS or email sign-in with automatic signup, and let signed-in users approve the QR code on your website's login page.

SDK para DesktopDescriçãoCódigo do SDKCódigo de exemplo
SDK para ElectronPara aplicativos Electroncasdoor-js-sdkcasdoor-electron-example
SDK para .NET DesktopPara aplicativos de desktop .NETcasdoor-dotnet-sdkWPF: casdoor-dotnet-desktop-example
WinForms: casdoor-dotnet-winform-example
Avalonia UI: casdoor-dotnet-avalonia-example
SDK para C/C++Para aplicativos de desktop C/C++casdoor-cpp-sdkcasdoor-cpp-qt-example
SDK para frontend WebDescriçãoCódigo do SDKCódigo de exemplo
SDK para JavascriptPara sites tradicionais não-SPAcasdoor-js-sdkNodejs backend: casdoor-raw-js-example
Go backend: casdoor-go-react-sdk-example
SDK apenas para FrontendPara sites SPA apenas de frontendcasdoor-js-sdkcasdoor-react-only-example
SDK para ReactPara sites Reactcasdoor-react-sdkNodejs backend: casdoor-nodejs-react-example
Java backend: casdoor-spring-security-react-example
SDK para Next.jsPara sites Next.jsnextjs-auth
SDK para NuxtPara sites Nuxtnuxt-auth
Vue SDKFor Vue websitescasdoor-vue-sdkcasdoor-python-vue-sdk-example
Angular SDKFor Angular websitescasdoor-angular-sdkcasdoor-nodejs-angular-example
SDK FlutterFor Flutter Web websitescasdoor-flutter-sdkcasdoor-flutter-example
ASP.NET SDKFor ASP.NET Blazor WASM websitesBlazor.BFF.OpenIDConnect.Templatecasdoor-dotnet-blazorwasm-oidc-example
SDK para FirebasePara aplicativos Google Firebasecasdoor-firebase-example

Pair the frontend with a backend SDK in your server’s language:

SDK para backend WebDescriçãoCódigo do SDKCódigo de exemplo
SDK para GoPara backends Gocasdoor-go-sdkcasdoor-go-react-sdk-example
SDK para JavaPara backends Javacasdoor-java-sdkcasdoor-spring-boot-starter, casdoor-spring-boot-example, casdoor-spring-security-react-example
SDK para Node.jsPara backends Node.jscasdoor-nodejs-sdkcasdoor-nodejs-react-example
SDK para PythonPara backends Pythoncasdoor-python-sdkFlask: casdoor-python-vue-sdk-example
Django: casdoor-django-js-sdk-example
FastAPI: casdoor-fastapi-js-sdk-example
SDK para PHPPara backends PHPcasdoor-php-sdkwordpress-casdoor-plugin
SDK para .NETPara backends ASP.NETcasdoor-dotnet-sdkcasdoor-dotnet-sdk-example
SDK para RustPara backends Rustcasdoor-rust-sdkcasdoor-rust-example
SDK para C/C++Para backends C/C++casdoor-cpp-sdkcasdoor-cpp-qt-example
SDK para DartPara backends Dartcasdoor-dart-sdk
SDK para RubyPara backends Rubycasdoor-ruby-sdk

All official SDKs: https://github.com/orgs/casdoor/repositories?q=sdk&type=all&language=&sort=.

Using the SDK​

1. Configuração do SDK de backend​

On startup, call the SDK’s init function with your Casdoor endpoint, client ID, client secret, and (for JWT validation) the public key. Example with casdoor-go-sdk: 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)
}

All the parameters for InitConfig() are explained as follows:

ParâmetroObrigatórioDescrição
ponto de extremidadeSimCasdoor Server URL, like https://door.casdoor.com or http://localhost:8000
clientIdSimID do Cliente para a aplicação Casdoor
clientSecretSimSegredo do Cliente para a aplicação Casdoor
jwtPublicKeySimA chave pública para o certificado da aplicação Casdoor
organizationNameSimO nome da organização Casdoor
applicationNameNãoO nome da aplicação Casdoor
dica

The jwtPublicKey can be managed in the Certs page as below.

Certs Management

Copy or download the public key from the certificate edit page for use in the SDK.

Certs Edit

Then select the cert on the application edit page.

Certs Select

2. Configuração do frontend​

Primeiro, instale casdoor-js-sdk via NPM ou Yarn:

npm install casdoor-js-sdk

Ou:

yarn add casdoor-js-sdk

Then define the following utility functions (better in a global JS file like 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;
}

In your frontend entry file (e.g. index.js or app.js in React), initialize the casdoor-js-sdk by calling InitConfig() with the required parameters. Os primeiros 4 parâmetros devem usar o mesmo valor que o SDK de backend do Casdoor. The last parameter redirectPath is relative path for the redirected URL, returned from Casdoor's login page.

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

xxx.initCasdoorSdk(config);

(Optional) This example uses React; the /callback route is handled by the component below, which forwards the call to the backend. Skip this if your callback goes directly to the backend (e.g. JSP or 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. Obter URLs de login​

Show "Sign up" and "Sign in" buttons or links to users; URLs can be obtained from the frontend or backend. See Login URLs.

4. Obter e verificar token de acesso​

Aqui estão os passos:

  1. The user clicks the login URL and is redirected to Casdoor's login page, like: 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. The user enters username & password and clicks Sign In (or just click the third-party login button like Sign in with GitHub).
  3. The user is redirected back to your application with the authorization code issued by Casdoor ( like: https://forum.casbin.com?code=xxx&state=yyy), your application's backend needs to exchange the authorization code with the access token and verify that the access token is valid and issued by Casdoor. The functions GetOAuthToken() and ParseJwtToken() are provided by Casdoor backend SDK.

O código a seguir mostra como obter e verificar o token de acesso. For a real example of Casnode (a forum website written in Go), see: 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)
}

If ParseJwtToken() finishes with no error, then the user has successfully logged into the application. The returned claims can be used to identity the user later.

4. Identificar usuário com token de acesso​

informação

Esta parte é na verdade a lógica de negócios do próprio aplicativo e não faz parte do OIDC, OAuth ou Casdoor. Nós apenas fornecemos boas práticas, pois muitas pessoas não sabem o que fazer para o próximo passo.

No Casdoor, o token de acesso é geralmente idêntico ao token de ID. Eles são a mesma coisa. Então o token de acesso contém todas as informações para o usuário logado.

The variable claims returned by ParseJwtToken() is defined as:

type Claims struct {
User
AccessToken string `json:"accessToken"`
jwt.RegisteredClaims
}
  1. User: the User object, containing all information for the logged-in user, see definition at: /docs/basic/core-concepts#user
  2. AccessToken: the access token string.
  3. jwt.RegisteredClaims: some other values required by JWT.

At this moment, the application usually has two ways to remember the user session: session and JWT.

Session​

O método para definir a sessão varia muito dependendo da linguagem e do framework web. E.g., Casnode uses Beego web framework and set session by calling: 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​

The accessToken returned by Casdoor is actually a JWT. Então, se o seu aplicativo usa JWT para manter a sessão do usuário, basta usar o token de acesso diretamente para isso:

  1. Envie o token de acesso para o frontend, salve-o em locais como o localStorage do navegador.
  2. Deixe o navegador enviar o token de acesso para o backend para cada solicitação.
  3. Call ParseJwtToken() or your own function to verify the access token and get logged-in user information in your backend.

5. (Optional) Interact with the User table​

informação

This part is provided by Casdoor Public API and not part of the OIDC or OAuth.

O Casdoor Backend SDK fornece muitas funções auxiliares, não limitadas a:

  • GetUser(name string): get a user by username.
  • GetUsers(): get all users.
  • AddUser(): add a user.
  • UpdateUser(): update a user.
  • DeleteUser(): delete a user.
  • CheckUserPassword(auth.User): check user's password.

These functions are implemented by making RESTful calls against Casdoor Public API. If a function is not in the Casdoor Backend SDK, call the Public API directly.

6. (Optional) Manage Applications via SDK​

Casdoor SDKs also provide functions to manage applications programmatically:

  • AddApplication(): create a new application.
  • GetApplication(name string): get an application by name.
  • GetApplications(): get all applications.
  • UpdateApplication(): update an application.
  • DeleteApplication(): delete an application.

When creating applications via SDK using AddApplication(), Casdoor automatically initializes essential fields with sensible defaults. This includes signup items (ID, Username, Display name, Password, Confirm password, Email, Phone, Agreement), signin items, and signin methods. This ensures applications created programmatically work correctly in the UI without requiring manual configuration of these basic settings.