问题背景:
为了识别用户身份,开发者可以通过认证服务的Server SDK验证已经颁发的用户凭据并且检查用户凭据是否已经撤销,可是在客户端认证成功后,使用文档中的代码进行验证时返回了下列验证失败信息:errorcode:2027,errorMsg:jwt verify faild。下面是客户端认证时获取token的方法:
void getUserToken() async {
//依赖的认证sdk是:agconnect_auth: ^1.5.0+300
final user = await AGCAuth.instance.currentUser;
if (user != null) {
user.getToken().then((tokenResult) {
final token = tokenResult.token;
debugPrint('token = $token');
});
}
}
问题分析:
验证用户凭据的原理就是,开发者使用AGC认证服务,在客户端获得认证的token,然后使用这个token在服务端调用AGCAuth.verifyAccessToken验证已颁发的用户凭据,用户凭据验证验证结果有四种:验证成功、验证失败、用户凭据已过期和用户凭据已撤销,下面的代码是验证的方法和返回的异常状态。
try {
AuthAccessToken authAccessToken = agcAuth.verifyAccessToken(accessToken, true);
} catch (AGCAuthException e) {
if (e.getErrorCode() == AuthErrorCode.VERIFY_ACCESS_TOKEN_ACCESS_TOKEN_IS_NULL.getErrorCode()) {
// 用户访问凭据为空
} else if (e.getErrorCode() == AuthErrorCode.JWT_VERIFY_FAILED.getErrorCode()) {
// 用户访问凭据验证失败
} else if (e.getErrorCode() == AuthErrorCode.JWT_EXPIRE.getErrorCode()) {
// 用户访问凭据已过期
} else if (e.getErrorCode() == AuthErrorCode.JWT_REVOKED.getErrorCode()) {
// 用户访问凭据已撤销
}
从接口方法可以看出只有accessToken一个入参,所以有可能是传入的token有问题。在沟通研发人员时得知出现这个失败报错还有可能是客户端凭据文件错误,客户端凭据文件的获取方法是在“我的项目 > 项目概览 > Server SDK”页面,点击“下载认证凭据”按钮,将下载好的json文件放入项目中,读取文件对SDK进行初始化。如果这个json凭据文件有问题,也是会出现问题报错的。
于是先检查json凭据文件,我们重新下载了凭据文件使用传入的token文件重新验证,依然会报错。那应该是token出了问题,客户端可以认证成功,说明客户端获取的token是正确的,那就可能传输过程出现了问题。我们将客户端获取的token和传入服务端的token进行仔细比对,发现了传入服务端的token比客户端的少了一部分,被截断了,肯定会报错。token是开发者通过自己的接口进行传输的,可能是传输过程中被截断了,我们推荐他将生成的token写入文件中传入后台,直接用代码输出,token可能会截断,最终问题得到解决。
解决方案:
验证用户凭据时出现“jwt verify faild”的失败信息时请检查下列信息:
1.json凭据文件是否有问题,正确的获取方法请参考文档:
2.检查服务端接收的token是否正确,确保与客户端认证成功后获取的token一致,防止在传输过程中截断,推荐将生成的token写入文件中传入后台。