跳到主内容

微信小程序

信息

Casdoor 1.41.0 起支持微信小程序。

微信小程序不使用标准的 OAuth 跳转,所以登录时是把小程序的登录 code 发给 Casdoor,而不是跳转到 Casdoor 页面。示例:casdoor-wechat-miniprogram-example。另见 微信小程序登录。

配置:CASDOOR_HOSTNAME:Casdoor 服务器地址(例如 https://door.casbin.com)。

步骤1:部署Casdoor​

部署 Casdoor 服务器。然后:

  1. 确认 Casdoor 可以访问并正常工作。
  2. 在 conf/app.conf 中把 origin 设为 CASDOOR_HOSTNAME。

Casdoor 配置

步骤2:配置应用程序​

  1. 在 Casdoor 中创建一个类型为 WeChat 的 OAuth 提供商,填入微信小程序后台的 APPID 和 APPSECRET。 WeChat_MiniProgram.png
  2. 创建或编辑一个 Casdoor 应用,加上这个微信提供商。
信息
Casdoor 把应用中第一个微信类型的提供商当作小程序的 IdP。使用小程序时,每个应用只配置一个微信提供商。

第 3 步:小程序代码​

小程序调用 wx.login() 获取登录 code,再把 code 发给 Casdoor。 Casdoor 用它向微信换取 OpenID 和 SessionKey。示例:

// 在小程序中登录
wx.login({
success: res => {
// 这是需要发送给Casdoor的登录代码
console.log(res.code)

wx.request({
url: `${CASDOOR_HOSTNAME}/api/login/oauth/access_token`,
method: "POST",
data: {
"tag": "wechat_miniprogram", // 必填
"client_id": "6825f4f0af45554c8952",
"code": res.code,
"username": this.data.userInfo.nickName, // 登录时更新用户资料。
"avatar": this.data.userInfo.avatarUrl,
},
header:{
"content-type": "application/x-www-form-urlencoded",
},
success: res => {
console.log(res)
this.globalData.accessToken = res.data.access_token // 获取Casdoor的访问令牌
}
})
}
})

需要注意的是,tag参数对于告知Casdoor这是来自微信小程序的请求是必须的。

上述代码在登录时包含了微信小程序用户的用户名和头像URI。您可以选择分别传递这两个参数,然后在成功登录并获取访问令牌后将它们传递给Casdoor:

wx.getUserProfile({
desc: '将您的信息分享给Casdoor',
success: (res) => {
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
console.log(app.globalData.accessToken)
wx.request({
url: `${CASDOOR_HOSTNAME}/api/update-user`, // Casdoor URL
method: "POST",
data: {
"owner": "test",
"name": "wechat-oGk3T5tIiMFo3SazCO75f0HEiE7Q",
"displayName": this.data.userInfo.nickName,
"avatar": this.data.userInfo.avatarUrl
},
header: {
"Authorization": "Bearer " + app.globalData.accessToken, // Bearer token
"content-type": "application/json"
},
success: (res) => {
console.log(res)
}
})
}
})

此外,您可以将访问令牌用作您需要的任何Casdoor操作的持有人令牌。

Tips

目前,Casdoor无法将现有账户绑定到微信小程序用户。在Casdoor从微信获取OpenID后,如果ID不存在,它将创建一个新用户,如果存在,它将使用现有用户。