Skip to main content

Casdoor SDK

一. 导言

与标准的 OIDC 协议相比,Casdoor 在 SDK 中提供了更多的功能,如用户管理、资源上传等。 通过 Casdoor SDK 连接到Casdoor 的成本比使用 OIDC 标准客户端库更高,但将提供最佳灵活性和最强大的 API。

城门SDK可分为两类:

  1. 前端 SDK︰ Javascript SDK for websites, Android 或 iOS SDK for App。 花门支持为网站和移动应用程序提供身份验证。
  2. 后端 SDK: Go, Java, Node.js, Python, PHP 等后端语言的 SDKs 。
如果您的网站是以前端和后端分隔的方式开发的, 然后您可以使用 Javascript SDK: casdoor-js-sdk 在前端集成城门。 如果您的网页应用程序是由 JSP 或 PHP 开发的传统网站,您只能使用后端SDK。 :::
连锁前端 SDK描述源代码
Javascript SDK对于网站https://github.com/casdoor/casdoor-js-sdk
Android SDK适用于 Android 应用程序https://github.com/casdoor/casdoor-android-sdk
iOS SDK适用于 iOS 应用程序https://github.com/casdoor/casdoor-ios-sdk

接下来,根据您后端的语言,使用下面的后端SDK之一:

后端 SDK源代码
去SDKhttps://github.com/casdoor/casdo-go-sdk
Java SDKhttps://github.com/casdoor/casdoor-java-sdk
Node.js SDKhttps://github.com/casdoor/casdoor-nodejs-sdk
Python SDKhttps://github.com/casdoor/casdoor-python-sdk
PHP SDKhttps://github.com/casdoor/casdoor-php-sdk
.NET SDKhttps://github.com/casdoor/casdonet-sdk

官方的 Cassdoor SDK 完整列表请查看:https://github.com/casdoor?q=sdk&type=all&language=&sort=

如何使用 Casdoor SDK ?

1. 后端 SDK 配置

当您的应用程序启动时,您需要调用 InitConfig() 函数来初始化Casdoor SDK 配置。 例举Casdoor-go-sdk 为示例:https://github.com/casbin/casnode/blob/6d4c55f5c9a3c4bd8c85f2493abad3553b9c7ac0/controllers/account.go#L51-L64

var CasdoorEndpoint = "https://door.casbin.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)
}

InitConfig() 的所有参数被解释为:

参数必须的描述
endpointCasto服务器URL,例如: https://door.casbin.com or http://localhost:8000
clientIdCasdoor 应用程序的客户端 ID
clientSecretCasdoor 应用程序的客户端密钥
jwtPublicKeyCassdoor 应用程序证书的公钥
组织名称Casdoor 组织的名称
应用程序名称Casdoor 应用程序的名称

2. 前端配置

首先,通过 NPM 或 Yarn安装 casdoor-js-sdk

npm install casdoor-js-sdk

或者:

yarn 添加 casdoor-js-sdk

然后定义以下实用功能(在全局JS文件中更好,比如 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);
}

在您的前端代码的入口文件 (如 index.jsapp)。 s 在React中, 您需要通过调用 InitConfig() 函数来初始化 casdoor-js-sdk 前4个参数应该使用与 Casdoor 后端SDK 相同的值。 最后一个参数 重定向路径 是从Cassdoor的登录页面返回的重定向URL的相对路径。

confst config =
serverUrl: "https://door.casbin.com",
clientId: "014ae4bd048734ca2de",
organization名称: "casbin",
appName: "app-casnode",
redirectPath: "/callback",
};

xxx.initCasdoorSdk(config);

(可选) 因为我们正在使用React作为示例,所以我们 /callback 路径正在撞击React路由, 我们使用以下React组件接收 /callback 调用并发送到后端。 如果您直接重定向到后端(如JSP 或 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="size"
tip="正在登录..."
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. 获取登录 URL

接下来您可以显示“注册”和“登录”按钮或链接到您的用户。 可以在前端或后端检索URL。 详细信息见: /docs/basic/core-concepts#login-urls

4. 获取并验证访问令牌

下面是步骤:

  1. 用户点击登录URL并重定向到Cassdoor的登录页面,如 https://door.casbin。 om/login/oauth/authorize?client_id=014ae4bd048734ca2dea&response_type=code&redirect_uri=https%3A%2F%2Fforum.casbin.com%2F回调&scope=read&state=app-casnode
  2. 用户输入用户名 & 密码并点击 登录 (或点击第三方登录按钮,如 使用 GitHub 登录)。
  3. 该用户被重定向到您的应用,使用Casto发行的授权码(例如: https://forum.casbin)。 om?code=xxx&state=yyy), 您的应用程序的后端需要将授权码与访问令牌交换,并验证访问令牌是否有效和由Casdoor签发。 函数 GetOAuthToken() and ParseJwtToken() 由 Casdoor 后端SDK 提供。

以下代码显示如何获取并验证访问令牌。 Casnode (一个论坛网站写入Go),见: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)
}

如果 ParseJwtToken() 结束时没有错误,那么用户已成功登录到应用程序。 返回的 认领 可以稍后用来识别用户。

4. 用访问令牌识别用户

::info 这个部分实际上是您的应用程序自己的业务逻辑,而不是OIDC, OAuth 或 Cassdoor的一部分。 我们只是提供良好做法,因为许多人不知道下一步怎么办。 :::

在Cassdoor中,访问令牌通常与ID令牌相同。 它们是同样的。 所以访问令牌包含登录用户的所有信息。

ParseJwtToken() 返回的变量 claims 被定义为:

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: 访问令牌字符串。
  3. jwt.RegisteredClaim: JWT需要一些其他值。

此时此刻,应用程序通常有两种方法记住用户会话: session and JWT

会议

设置会议的方法因语言和网络框架而大不相同。 例如,Casnode 使用 Beego web 框架 并通过调用设置会话: c.SetSessionUser()

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

claim, err := auth.ParseJwtToken(token) ccccessToken)
如果err != nil 然后
panic(err)
}

claims.AccessToken = token.AccessToken
c.SetSessionUser(claims) // 设置会话

JWT

从城门返回的 访问令牌 实际上是一个 JWT。 因此,如果您的应用程序使用 JWT 来保持用户会话,只需直接为它使用访问令牌:

  1. 将访问令牌发送到前端,在本地存储浏览器等地方保存。
  2. 让浏览器为每个请求发送访问令牌到后端。
  3. 调用 ParseJwtToken() 或您自己的函数来验证访问令牌并在您的后端获取登录用户信息。

5. (可选) 与用户表的互动

Casdoor Backend SDK 提供了许多助手功能,不仅限于:

  • GetUser(名称字符串): 通过用户名获取用户。
  • GetUsers(): 获取所有用户。
  • AddUser(): 添加一个用户。
  • UpdateUser(): 更新一个用户。
  • DeleteUser(): 删除一个用户。
  • 检查用户密码(auth.User): 检查用户的密码。

这些函数是通过对 Castor Public API 进行RESTful 通话实现的。 如果在 Casdoor 后端SDK 中没有提供函数,您可以自己进行RESTFify的呼叫。