软件技术-零基础-MD5加密处理和自动跳转

欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
【汇总】2019年4月专题


如何将用户的密码加密之后再存储?


人工智能通识-2019年3月专题汇总

MD5

加密的目的是保护用户的隐私,尤其是一些很敏感的密码,原则上这些密码的明文只能出现在用户电脑上,不能在网络上传输,更不能存储在网站服务器上。

MD5是一种不可逆的加密算法,就是说它可以把用户密码变为一串新字符,而原则上没有任何方法可以把这串新字符再变回去找到用户真实的密码。(但没有什么是绝对的,只是相对来说是这样)

MD5总是生成32个英文字符和字母混合的字符串。

前端加密

实际上我们只需要在网页端将用户所有输入的密码都处理一下就可以了,不涉及后端服务器程序,因为用户密码到底是什么格式,对于服务器来说都是一样的存储、验证。

需要为前端相关页面register.html,login.html,resetPw.html都添加一个加密工具:

    <script src="https://cdn.bootcss.com/spark-md5/3.0.0/spark-md5.min.js"></script>

然后把所有向接口发送的Pw数据都用SparkMD5.hash代码包裹一下:

Pw: SparkMD5.hash($('#pw').val())

然后Golang服务端对Pw验证的正则表达式改为^[0-9a-z]{32}$,应该涉及到login.go,register.go,resetPw.go等多个文件。

然后把服务端数据库都删除,然后重新测试登录和注册、改密码和自动登录功能。

注册和重置后自动登录

先做一个统一的创建新Token并写入Cookie的方法ext/NewToken.go,其代码如下:

package ext

import (
    "app/tool"
    "app/util"
    "context"
    "encoding/json"
    "net/http"
    "time"

    uuid "github.com/satori/go.uuid"
    "go.mongodb.org/mongo-driver/bson"
)

//NewToken 创建新token,返回一个基本的用户信息Token和Uid,用于用户手工登录注册和重置时候使用
func NewToken(w http.ResponseWriter, uids string) string {
    //创建token
    token, _ := uuid.NewV4()
    tokens := token.String()

    //删除旧的,创建新的
    coll := tool.MongoDBCLient.Database("myweb").Collection("token")
    du := bson.M{"Token": tokens, "Id": uids, "Ts": time.Now().Unix()}
    du2 := bson.M{"Id": uids}
    coll.DeleteMany(context.TODO(), du2)
    coll.InsertOne(context.TODO(), du)

    //返回对象
    data := map[string]string{
        "Token": tokens,
        "Uid":   uids}

    datas, err := json.Marshal(data)
    if err != nil {
        return ""
    }

    //返回id,写入Token和Uid
    util.SetCookie(w, "Uid", uids)
    util.SetCookie(w, "Token", tokens)
    return string(datas)
}

这个主要是为了将登录、注册和重置密码后所要做的同样工作统一在一起了。

然后我们就可以修改login.go简化很多:

    if u["Pw"] == ds.Pw {
        uids := u["_id"].(primitive.ObjectID).Hex()

        datas := ext.NewToken(w, uids)
        util.WWrite(w, 0, "登录成功", datas)
    } else {
        util.WWrite(w, 1, "邮箱与用户名不匹配", nil)
    }
    return

同样简化register.go:

    uids := res.InsertedID.(primitive.ObjectID).Hex()

    datas := ext.NewToken(w, uids)
    util.WWrite(w, 0, "注册成功。", datas)
    return

修改resetPw.go

    //创建token,返回修改的账号
    var nu bson.M
    dbc.FindOne(context.TODO(), bson.M{"Email": ds.Email}).Decode(&nu)
    uids := nu["_id"]
    datas := ext.NewToken(w, uids.(string))
    util.WWrite(w, 0, "修改成功", datas)
    return

这样我们再登录、注册和重置之后都会更新Token,如果需要获取用户邮箱等信息,可以再执行autoLogin接口就可以了。

自动跳转

比如说用户打开首页,然后会执行autoLogin,没通过,被我们跳转到登录页,然后用户登录成功,——这时候应该跳转回首页啊,怎么跳?
我们之前使用过location = '/page/login.html'实现跳转。

但是,当我们处于登录页的时候,登陆成功我们要跳回去,但我们怎么知道用户从哪里过来的呢?

所以在跳过来的时候就必须做好标记传递原来的页面地址过来。

首先在index.html中修改跳转链接:

location = '/page/login.html?ref='+location.pathname

这里的location.pathname就是页面地址。
然后在login.html页面中增加用来提取链接的工具

<script src="https://cdn.bootcss.com/jquery-url-parser/2.3.1/purl.min.js"></script>

登录成功后修改:

        $.post('/api/Login', JSON.stringify(data), function (res) {
            if (res['Code'] == 0) {
                //登录成功
                location = purl(location.href).param('ref') || "/"
            } else {
                alert(res['Msg'])
            }
        }, 'json')

这里purl(location.href).param('ref')表示提取刚才传过来的地址。双竖线表示如果没有传来地址那么就回/首页。

同时我们修改一下注册按钮链接,改为使用script跳转:

            <a onClick='goReg()' style="color:#CCC;cursor: pointer;">
                <h4>注册</h4>
            </a>

底部添加配套的代码:

    //注册链接动态跳转
    function goReg(){
        ref=purl(location.href).param('ref')
        fix=ref?('?ref='+ref):''
        location = '/page/register.html'+fix
    }

可以使用同样的方法添加忘记密码页面的链接跳转到forgotPw.html页面。也可以为register.htmlforgotPw.html修改类似的成功跳转回去的功能。

小结

前后从开始部署Golang到编写前端页面,然后前后端一起实现登录注册功能,这里总计用了15篇文章,基本上告一段落,后续还有很多内容,大家可以从Golang官方


欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】


每个人的智能新时代

如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~


END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容