第三方账户登录--github

使用github账户进行第三方登录授权
前端vue,后端node+express+mysql,使用什么框架技术不重要,大体的授权逻辑是一样的
项目源码

效果预览

github授权登录

1.项目创建准备(前端+后端+数据库)

前端

前端使用vue-cli3创建项目,可以参考这篇文章 vue-cli3项目

vue create web
后端

使用node+express创建项目,可以参考这篇文章 node+express项目

// 安装express及构造器
npm install express -g
npm install express-generator -g
// 初始化express项目
express server
数据库

新建一个数据库:test,
新建数据表:user_info,
添加username,password,portrait,login_time,shss_token字段

数据库test

2.再github上配置授权登陆信息

注册或登录github,一次选择Settings => Developer settings => New OAuth App

如果有域名的直接添加域名,如果像我这样开发测试的,指定为本地前端项目运行地址就行

guthub授权信息
保存id和secret

登记成功后会显示应用的id和secret,后面会用到。

id和secret

3.前端获取github提供的code并传给服务端

3.1 安装引入axios

为了方便开发,未作封装,只是简单的全局引入axios axios封装

npm install axios --save
3.2 全局引入 web/src/main.js
import axios from 'axios'
axios.defaults.baseURL='http://localhost:3000';
global.axios=axios;
3.3 跳转github登录授权页面 web/src/views/Home.vue
<template>
  <div>
    <button @click="toGithub">github登录</button>
  </div>
</template>

<script>
//github登录授权页面
let oauth_uri='https://github.com/login/oauth/authorize'
//github中获取
let client_id = 'c26a2c36287f5662ed62'
//授权回调地址
let redirect_uri = 'http://192.168.1.177:8081'
export default {
  methods: {
    toGithub() {
      window.location.href = `${oauth_uri}?client_id=${client_id}&redirect_url=${redirect_uri}`
    }
  }
};
</script>
3.4 新建授权回调页面及路由

根据在github上面配置的Authorization callback URL配置前端路由及页面

Authorization callback URL

创建对应路由 web/src/router.js

    {
      path: "/github/auth",
      name: "github",
      component: () =>
        import(/* webpackChunkName: "about" */ "./views/Github.vue")
    }

创建对应页面 web/src/views/Github.vue

<template>
  <div>
    <div>{{githubUser}}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      githubUser: "github登陆中..."
    };
  },
  mounted() {
    let code = this.$route.query.code;
    console.log(code)
  }
};
</script>

<style lang="scss" scoped>
</style>
3.5 axios发送code至服务端
  mounted() {
    let code = this.$route.query.code;
    axios
      .get(`/users/github_auth?code=${code}`)
      .then(res => {
        if (res.data.data.username) {
          this.githubUser = res.data.data.username;
        }
      })
      .catch(function(err) {
        console.log(err);
      });
  }

4.服务端接收code,获取用户信息,并插入数据库返回给前端

如果是自己在本地搭的node后台,因端口不一样,前台请求会有跨域问题,可以通过CORS解决,相关文章:CORS解决跨域问题
node代码直接写在一个接口中处理,每一步都写了清晰的注释

server/routes/users.js

var express = require("express");
var router = express.Router();
const fetch = require("node-fetch");
var mysql = require("mysql"); //引入mysql
//数据库配置
var db = {
  mysql: {
    host: "localhost",
    user: "root", //数据库用户名
    password: "root", //数据库密码
    database: "test", //要链接的数据库
    port: 3306 //默认端口
  }
};
var selAll = "select * from user_info";
var pool = mysql.createPool(db.mysql);

router.get("/github_auth", async (req, res, next) => {
  let code = req.query.code;
  //获取github的access_token请求地址
  let path = "https://github.com/login/oauth/access_token";
  const params = {
    //id和secret
    client_id: "c26a2c36287f5662ed62",
    client_secret: "f88afd71471725488ed301697f634c7d85d5524c",
    //前端发送的code
    code: code
  };
  await fetch(path, {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify(params)
  })
    .then(res => {
      return res.text();
    })
    .then(body => {
      //解析并返回access_token
      let args = body.split("&");
      let arg = args[0].split("=");
      let access_token = arg[1];
      return access_token;
    })
    .then(async token => {
      //通过token获取用户信息
      let url = "https://api.github.com/user?access_token=" + token;
      await fetch(url)
        .then(res2 => {
          return res2.json();
        })
        .then(response => {
          //拿到github用户信息
          //写入数据库
          let insertUser =
            "INSERT INTO user_info (id,username,portrait) VALUES (?,?,?)";
          let data = [response.id, response.login, response.avatar_url];
          pool.getConnection(function(err, suc) {
            //测试demo并未做用户筛选等处理
            //可以在此处验证用户是否已授权,或已存在于数据库中
            suc.query(insertUser, data, function(err, result) {
              if (result) {
                //插入新用户成功之后再把用户信息返回给前端
                var getUser = "select * from user_info where id=?";
                suc.query(getUser, [result.insertId], function(err, userRes) {
                  sendRes = {
                    //返回数据与格式
                    code: 200,
                    msg: "三方登录成功",
                    data: userRes[0]
                  };
                  res.json(sendRes); //响应返回json数据
                  suc.release();
                });
              }
            });
          });
        });
    })

    .catch(e => {
      console.log(e);
    });
});

module.exports = router;

最后

关于第三方授权登录,个人认为既然用户选择了第三方授权登录,就不要在用户同意授权之后再返回网站选择注册账号,与网站账号是否绑定应该取决于用户自己,否则授权之后再注册,这跟耍流氓没啥区别。

还有第三方授权登录的用户表和直接网站注册的用户表,我认为可以放在一个表中,也可以分开放,如果放在一个表里面,就在用户授权之后信息保存数据库,用户只能通过授权才能登录,除非用户选择绑定网页账户。分开放的话应该更清晰一些,不过我本人对数据库方面了解也不多。。怎么存还是看各自网站的需求了

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

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,119评论 0 1
  • 简说Vue (组件库) https://github.com/ElemeFE/element" 饿了么出品的VUE...
    Estrus丶阅读 1,225评论 0 1
  • 车祸已经过去十四天。这十四天,我走了一条漫长、暗黑的心路历程,也小心翼翼地屡次撕开自己的疮疤去揣度很多人的...
    风味犹似去年时阅读 181评论 0 0
  • 2017年6月14日 星期三 每天都做着重复的事,加好友,找顾客聊天,其实每天坚持下来会有意想不到的收获,今天课...
    佳丽_Xiong阅读 177评论 0 1
  • 路线设计思路:南极是一片被冰原覆盖的神秘大陆,至今无人类居住,常年温度在-80℃~-60℃,是世界上最为寒冷的地区...
    WankaTravel阅读 219评论 0 0