WeKey1.1

此模块包含 WeKey1.1 对接的相关接口,用于提供 Web 服务器快速支持 FIDO 扫码认证的能力。

# 安装方式
$ go get github.com/trustasia-com/go-sdk

对接过程包括两部分:

  1. 服务端对接
  2. Web端对接

Web端对接建议采用WeKey提供的最佳实践进行对接。

服务端对接

从WeKey控制台获取到 AccessKeySecretKey

# 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)

注册凭证

注册凭证是用户在您的应用后台进行凭证的添加过程,所以用户应该是登录状态。

fido-scan-register

这里以 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,
		})
	})

认证凭证

用户通过二维码认证登录的情况下使用。

fido-scan-login

	// 创建二维码
	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,
		})
	})