基于java的动态口令_java动态口令登录实现过程详解

基于java的动态口令_java动态口令登录实现过程详解1.实现一个ItsClient客户端用来实例化调用验证功能publicclassItsClient{privatestaticfinalStringrouting=”/v1.0/sectoken/otp_validation”;//!HTTPS消息验证地址privateStringhttpsVerifyUrl=””;//!otpipAddrprivateSt…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1.实现一个ItsClient 客户端用来实例化调用验证功能

public class ItsClient {

private static final String routing = “/v1.0/sectoken/otp_validation”;

// ! HTTPS消息验证地址

private String httpsVerifyUrl = “”;

// ! otp ipAddr

private String ipAddr = “”;

// ! otp port

private String port = “”;

// ! otp appID

private String appID = “”;

// ! otp appKey

private String appKey = “”;

// ! 错误码

private int errorCode = 0;

// ! 错误消息

private String errorMessage = “”;

TreeMap errorCodeTable = new TreeMap() {

{

put(200, “请求成功”);

put(400, “输入不合法,比如请求数据不是json”);

put(401, “AppID不合法”);

put(402, “指纹不合法”);

put(410, “非法用户,验证otp时,传入的uid有误,找不到用户”);

put(411, “错误的otp”);

put(412, “一个周期内动态口令只能使用一次”);

put(413, “已达一个周期内最大尝试次数”);

put(500, “ITS服务器内部错误”);

put(601, “参数错误”);

put(602, “sha1签名失败”);

put(603, “操作json失败”);

put(604, “url访问错误:”);

put(605, “较验返回指纹失败”);

}

};

public ItsClient() {

this.ipAddr = ItsConf.GetIpAddr();

this.port = ItsConf.GetPort();

this.appID = ItsConf.GetOtpAppID();

this.appKey = ItsConf.GetOtpAppKey();

httpsVerifyUrl = “https://” + this.ipAddr + ‘:’ + this.port + routing;

}

//获取错误信息

public String GetErrorMessage() {

return this.errorMessage;

}

//获取错误码

public int GetErrorCode() {

return this.errorCode;

}

public void SetError(int errorCode, String extMessage) {

this.errorCode = errorCode;

this.errorMessage = this.errorCodeTable.get(this.errorCode).toString() + extMessage;

}

public static String SHA1(String decript) throws NoSuchAlgorithmException {

String ret = “”;

MessageDigest sha1 = MessageDigest.getInstance(“SHA1”);

byte[] sha1bytes = sha1.digest(decript.getBytes());

if (sha1bytes != null) {

ret = new BASE64Encoder().encode(sha1bytes);

}

return ret;

}

public String EncodeJson(TreeMap map) {

JSONObject jmap = new JSONObject(map);

return jmap.toString();

}

public TreeMap DecodeJson(String jsonStr) throws ParseException {

JSONObject jsonObject = new JSONObject(jsonStr);

TreeMap retMap = new TreeMap();

Iterator iter = jsonObject.keys();

String key = null;

Object value = null;

while (iter.hasNext()) {

key = iter.next();

value = jsonObject.get(key);

retMap.put(key, value);

}

return retMap;

}

public String BuildQueryStr(TreeMap params) {

String queryStr = “”;

Iterator itr = params.keySet().iterator();

while (itr.hasNext()) {

String key = itr.next();

queryStr += (key + “=” + params.get(key).toString() + “&”);

}

return queryStr.substring(0, queryStr.length() – 1);

}

public boolean IsEmptyOrNull(String param) {

return param == null || param.length() <= 0;

}

/**

* @brief 验证otp

* @param uid ITS主账号UID或已配置的从账号

* @param otp 需要验证的动态口令

* @return bool true: 成功, false: 失败

*/

@SuppressWarnings(“serial”)

public boolean AuthOtp(final String uid, final String otp) {

if (IsEmptyOrNull(this.ipAddr) || IsEmptyOrNull(this.port) || IsEmptyOrNull(this.appID)

|| IsEmptyOrNull(this.appKey) || IsEmptyOrNull(uid) || IsEmptyOrNull(otp)) {

SetError(601, “”);

return false;

}

TreeMap params = new TreeMap() {

{

put(“app_id”, appID);

put(“app_key”, appKey);

put(“uid”, uid);

put(“otp”, otp);

}

};

String qureyStr = this.BuildQueryStr(params);

String fingerprint = “”;

try {

fingerprint = SHA1(qureyStr);

} catch (Exception ex) {

ex.printStackTrace();

SetError(602, ex.getMessage());

return false;

}

params.remove(“app_key”);

params.put(“fingerprint”, fingerprint);

String postStr = “”;

try {

postStr = EncodeJson(params);

} catch (Exception ex) {

ex.printStackTrace();

SetError(603, “json encode” + ex.getMessage());

return false;

}

HttpsClient conn = null;

String res = “”;

try {

conn = new HttpsClient();

res = conn.post(this.httpsVerifyUrl, postStr); // 访问接口调取返回结果

} catch (Exception ex) {

ex.printStackTrace();

SetError(604, ex.getMessage());

return false;

}

TreeMap ret = null;

try {

ret = DecodeJson(res);

} catch (Exception ex) {

ex.printStackTrace();

SetError(603, “json decode ” + ex.getMessage());

return false;

}

int retCode = (Integer) ret.get(“status”);

if (200 != retCode) {

SetError(retCode, “”);

return false;

}

return true;

}

}

2.实现一个HttpsClient 请求工具

public class HttpsClient {

final static HostnameVerifier doNotVerifier = new HostnameVerifier() {

public boolean verify(String hostname, SSLSession session) {

return true;

}

};

/**

* @brief 发送请求

* @param httpsUrl 请求的地址

* @param postStr 请求的数据

* @throws Exception

*/

public String post(String httpsUrl, String postStr) throws Exception {

HttpsURLConnection conn = null;

StringBuffer recvBuff = new StringBuffer();

String resData = “”;

try {

conn = (HttpsURLConnection) (new URL(httpsUrl)).openConnection();

conn.setHostnameVerifier(doNotVerifier);

conn.setDoInput(true);

conn.setDoOutput(true);

conn.setRequestMethod(“POST”);

conn.setRequestProperty(“Content-Type”, ” application/json”);

conn.setRequestProperty(“Content-Length”, String.valueOf(postStr.getBytes(“utf-8”).length));

conn.setUseCaches(false);

//设置为utf-8可以解决服务器接收时读取的数据中文乱码问题

conn.getOutputStream().write(postStr.getBytes(“utf-8”));

conn.getOutputStream().flush();

conn.getOutputStream().close();

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

recvBuff.append(line);

}

resData = recvBuff.toString();

return resData;

} catch (MalformedURLException ex) {

throw ex;

} catch (IOException ex) {

throw ex;

} catch (Exception ex) {

throw ex;

}

}

}

3.实现Its一个配置用来配置Its服务器信息接口访问地址

public class ItsConf {

// ITS服务器地址 1.1.1.1 或 xxx.xxx.com的形式

private static String ipAddr = “”;

// ITS服务器端口

private static String port = “”;

// OTP服务的AppID

private static String otpAppID = “”;

// OTP服务的AppKey

private static String otpAppKey = “”;

public static String GetIpAddr() {

return ipAddr;

}

public static String GetPort() {

return port;

}

public static String GetOtpAppID() {

return otpAppID;

}

public static String GetOtpAppKey() {

return otpAppKey;

}

}

4.接下来就是LoginContorller 完成口令认证

//username 用户名

//code动态口令密码

ItsClient itsClient = new ItsClient();

if(itsClient.AuthOtp(username, code)){

//认证成功,跳转页面

}

5.登陆页面就省略了,自己完成吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234943.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 如何反编译小程序的源码(微信小程序反编译工具)

    网易Mumu模拟器安装下载地址:http://mumu.163.com/360/ 下载完安装包后直接安装 打开模拟器安装微信、RE文件管理器设置Root权限打开RE文件管理器,提示请求超级用户访问权限,选择允许到此准备工作完成。打开微信,然后打开小程序,获取小程序编译包先打开微信 搜索微博小程序打开 打开RE文件管理 按照/data/data/com.tencent.mm/MicroMsg/80b34bca4945f…

  • discuz php接口文档,Discuz二次开发手册.doc[通俗易懂]

    discuz php接口文档,Discuz二次开发手册.doc[通俗易懂]Discuz二次开发手册Discuz文件说明,有助于discuz爱好者,进行自己的开发,在这里提供方便admincp.php——后台系统设置主程序文件,一般只处理菜单的显示的访问权限,不处理管理控制。ajax.php——论坛模板的ajax判断及数据返回都在这里进行attachment.php——附件文件,仅仅处理附件下载的功能。announcement.php——论坛公告的显示,一般很少改con…

  • virsh命令详解_1个无法解析的外部命令

    virsh命令详解_1个无法解析的外部命令virsh的详细命令解析virsh有命令模式和交互模式如果直接在vrish后面添加参数是命令模式,如果直接写virsh,就会进入交互模式virshlist 列出所有的虚拟机,虚拟机的状态有(8)种 runing是运行状态 idel是空闲状态 pause暂停状态 shutdown关闭状态 crash虚拟机崩坏状态 daying垂死状态 shutoff不运行完全关闭 pmsuspe…

  • 计算机发展概述教案_计算机的过去与未来 教案

    计算机发展概述教案_计算机的过去与未来 教案《计算机发展史教案》由会员分享,可在线阅读,更多相关《计算机发展史教案(3页珍藏版)》请在人人文库网上搜索。1、计算机发展与应用说课稿教材分析本课选自七年级信息技术上第三课,计算机的产生与发展。本课的内容较多,经过我的分析,我这节课的内容为:1,计算机的产生2,计算机的发展历史3,计算机的未来发展方向。本课知识为了解性知识,学生学完本课可以了解到今生今世的产生与发展历史,并且理解计算机的未来发展方…

    2022年10月18日
  • centos挖矿程序解决

    centos挖矿程序解决centos挖矿程序解决第一种办法:1.top找到cup占比最高的程序2.ps-aux|grepCOMMAND3.crontab-l查看定时任务4.然后删除挖矿脚本和定时任务脚本5.如果删不掉chattr-i脚本6.然后再删7.然后crontab-e清除掉脚本内容…

  • Linux 命令tail手动实现

    Linux 命令tail手动实现手动实现一个Linuxtail命令

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号