WeKey1.1
此模块包含 WeKey1.1 对接的相关接口,用于提供 Web 服务器快速支持 FIDO 扫码认证的能力。
# 安装方式
$ go get github.com/trustasia-com/go-sdk
对接过程包括两部分:
- 服务端对接
- Web端对接
Web端对接建议采用WeKey提供的最佳实践进行对接。
服务端对接
从WeKey控制台获取到 AccessKey
与 SecretKey
:
# endpoint
正式环境:https://api.wekey.com
创建客户端
import (
"github.com/trustasia-com/go-sdk/pkg/credentials"
"github.com/trustasia-com/go-sdk/wekey"
)
opts := credentials.Options {
AccessKey: "accessKey",
SecretKey: "secretKey",
Endpoint: "https://api.wekey.com",
SignerType: credentials.SignatureDefault,
}
// sess会自动处理签名
sess, err := credentials.New(opts, false)
if err != nil {
return err
}
wekeyCli := webauthn.New(sess)
注册凭证
注册凭证是用户在您的应用后台进行凭证的添加过程,所以用户应该是登录状态。
这里以 gin
为例:
// 创建二维码
e.POST("/register/qrcode", func(c *gin.Context) {
// 检测当前登录用户,获取用户相关信息
// u := {
// DisplayName
// Username
// Uid
// }
req := wekey.RegQRCodeReq{
DisplayName: u.DisplayName,
UserID: uid,
Username: u.Username,
}
// 调用 sdk 创建二维码
resp, err := wekeyCli.RegQRCode(req)
if err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
// 将响应返回给前端
c.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
"data": resp,
})
})
// 获取验证接口,/register/result?msg_id=xxx
e.GET("/register/result", func(c *gin.Context) {
// 检测当前登录用户,获取用户相关信息
// u := {
// DisplayName
// Username
// Uid
// }
req := wekey.RegResultReq{
MsgID: c.Query("msg_id"),
}
// 调用 sdk 查询结果,传入验证成功回调
resp, err := wekeyCli.RegResult(req, func(userID string) error {
// 验证成功,如果有其它逻辑需要添加
//
return nil
})
if err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
// 响应结果
c.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
"data": resp,
})
})
认证凭证
用户通过二维码认证登录的情况下使用。
// 创建二维码
e.POST("/login/qrcode", func(c *gin.Context) {
var req struct {
Username string `json:"username" binding:"required"`
}
// 获取登录用户名,做相关参数判断
if err := c.ShouldBindJSON(&req); err != nil {
c.String(http.StatusBadRequest, "invalid username")
return
}
// 获取用户相关信息
// u := {
// DisplayName
// Username
// Uid
// }
// 定义鉴权方式为二维码认证
method := wekey.AuthMethodQRCode
sdkreq := wekey.AuthRequestReq{
Method: method,
UserID: u.UserID,
Username: u.Username,
}
// 调用 sdk 创建二维码
resp, err := client.AuthRequest(sdkreq)
if err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
// 响应结果
c.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
"data": resp,
})
})
// 查询认证状态,/login/result?msg_id=xxxx
e.GET("/login/result", func(c *gin.Context) {
req := wekey.AuthResultReq{
MsgID: c.Query("msg_id"),
}
// 调用 sdk 查询接口,传入成功回调
resp, err := client.AuthResult(req, func(userID string) error {
// 回调内保存用户登录状态,如:
// session := sessions.Default(c)
// session.Set("user_id", userID)
// session.Save()
return nil
})
if err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
// 返回响应结果
c.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
"data": resp,
})
})