ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Golang仿云盘项目-4 账号系统与鉴权(1)-解决:登录 404 not found

2022-07-19 19:01:32  阅读:196  来源: 互联网

标签:username http err DEFAULT 云盘 Golang token 404 user


4.1 账号系统功能

解决:登录 404 not found
本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16490891.html

image

  • 支持用户注册、登录
  • 支持用户Session鉴权
  • 用户数据资源隔离

用户表设计

CREATE TABLE `tbl_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名',
  `user_pwd` varchar(256) NOT NULL DEFAULT '' COMMENT '用户encoded密码',
  `email` varchar(64) DEFAULT '' COMMENT '邮箱',
  `phone` varchar(128) DEFAULT '' COMMENT '手机号',
  `email_validated` tinyint(1) DEFAULT 0 COMMENT '邮箱是否已验证',
  `phone_validated` tinyint(1) DEFAULT 0 COMMENT '手机号是否已验证',
  `signup_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册日期',
  `last_active` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后活跃时间戳',
  `profile` text COMMENT '用户属性',
  `status` int(11) NOT NULL DEFAULT '0' COMMENT '账户状态(启用/禁用/锁定/标记删除等)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`user_name`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

4.2 用户注册/登录接口

注册接口

db/user.go

点击查看代码
// UserSignup: 通过用户名和密码完成user表的注册
func UserSignup(username, password string) bool {
	// 插入一条用户数据
	stmt, err := mydb.DBConn().Prepare("INSERT ignore INTO tbl_user(user_name, user_pwd)" + 
						  "VALUES(?,?)")
	if err != nil {
		fmt.Println("Failed to insert, err: " + err.Error())
		return false
	}
	defer stmt.Close()

	ret, err := stmt.Exec(username, password)
	if err != nil {
		fmt.Println("Failed to insert, err: " + err.Error())
		return false
	}

	// 校验是否注册成功(重复注册也当做注册失败)
	if rows, err := ret.RowsAffected(); nil == err && rows > 0 {
		return true
	}
	return false
}

// 用于处理用户请求的一些handler
handler/user.go

点击查看代码
// SignupHandler : 处理用户注册请求
func SignupHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method == "GET" {
		data, err := ioutil.ReadFile("./static/view/signup.html")
		if err != nil {
			w.WriteHeader(http.StatusInternalServerError)
			return
		}
		w.Write(data)
		return
	}
	
	r.ParseForm()

	username := r.Form.Get("username")
	passwd := r.Form.Get("password")

	if len(username) < 3 || len(passwd) < 5 {
		w.Write([]byte("Invalid parameter"))
		return
	}

	// 对密码进行加盐及取Sha1值加密
	encPasswd := util.Sha1([]byte(passwd + pwdSalt))
	// 将用户信息注册到用户表中
	suc := dblayer.UserSignup(username, encPasswd)
	if suc {
		w.Write([]byte("SUCCESS"))
	} else {
		w.Write([]byte("FAILED"))
	}
}

登录接口

  1. 校验用户名和密码
    比较请求上传参数中的数据和从数据库查出来的数据

  2. 生成访问凭证(token)

    -- 创建用户token表
    CREATE TABLE `tbl_user_token` (
    	`id` int(11) NOT NULL AUTO_INCREMENT,
      `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名',
      `user_token` char(40) NOT NULL DEFAULT '' COMMENT '用户登录token',
    	PRIMARY KEY (`id`),
      UNIQUE KEY `idx_username` (`user_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    replace: token 可重复生成且插入

  3. 登录后重定向回首页
    handler/user.go
    处理登录请求

    点击查看代码
    // SignInHandler : 登录接口
    func SignInHandler(w http.ResponseWriter, r *http.Request) {
    	if r.Method == "GET" {
    		http.Redirect(w, r, "/static/view/signin.html", http.StatusFound)
    		return
    	}
    
    	r.ParseForm()
    	username := r.Form.Get("username")
    	password := r.Form.Get("password")
    
    	encPasswd := util.Sha1([]byte(password + pwdSalt))
    
    	// 1. 校验用户名及密码
    	pwdChecked := dblayer.UserSignin(username, encPasswd)
    	if !pwdChecked {
    		w.Write([]byte("FAILED"))
    		return
    	}
    
    	// 2. 生成访问凭证(token)
    	token := GenToken(username)
    	upRes := dblayer.UpdateToken(username, token)
    	if !upRes {
    		w.Write([]byte("FAILED"))
    		return
    	}
    
    	// 3. 登录成功后重定向到首页
    	// w.Write([]byte("http://" + r.Host + "/static/view/home.html"))
    	resp := util.RespMsg{
    		Code: 0,
    		Msg: "OK",
    		Data: struct{
    			Location string
    			Username string
    			Token string
    		}{
    			Location: "http://" + r.Host + "/static/view/home.html",
    			Username: username,
    			Token: token,
    		},
    	}
    	w.Write(resp.JSONBytes())
    }
    

用户信息查询接口

handler/user.go

点击查看代码
func UserInfoHandler(w http.ResponseWriter, r *http.Request) {
	// 1. 解析参数
	r.ParseForm()
	username := r.Form.Get("username")
	token := r.Form.Get("token")

	fmt.Printf("username: %v\n", username)

	// 2.验证token是否有效
	if !isTokenValid(token) {
		w.WriteHeader(http.StatusForbidden)
		return
	}

	// 3. 查询用户信息
	user, err := dblayer.GetUserInfo(username)
	fmt.Printf("user: %v", user)
	if err != nil {
		w.WriteHeader(http.StatusForbidden)
		return
	}

	// 4. 组装并且响应用户数据
	resp := util.RespMsg{
		Code: 0,
		Msg: "OK",
		Data: user,
	}
	w.Write(resp.JSONBytes())
}

本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16490891.html

解决:登录 404 not found

问题1:视频缺少了加载静态文件的部分内容,搜索了一波,go的http库有这么几个方法:

http.StripPrefix() 方法配合 http.Handle()http.HandleFunc() 可以实现带路由前缀的文件服务
参考 https://cloud.tencent.com/developer/article/1351492

解决方法
在main.go文件的main方法中加上下面的代码

func main() {
	// static configure
	http.Handle("/static/", 
			http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
	...

问题2: 跳转home.html, 前端没有加载数据
image

解决
查看了home.html文件发现没有传数据。。。
home.html

...
<script lang="javascript">
  window.onload = function () {
    var username = document.getElementById('username');
    $.ajax({
      // url: "/user/info?" + queryParams(),  注释掉这句
      url: "/user/info",
      type: "POST",
	  // 加上data
      data: {username: localStorage.getItem("username"),
             token: localStorage.getItem("token")},
      error: function (jqXHR, textStatus, errorThrown) {
	  ...

完成

标签:username,http,err,DEFAULT,云盘,Golang,token,404,user
来源: https://www.cnblogs.com/cenjw/p/16490891.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有