微服务接入oauth2_分分钟让自己的网站接入 GitHub 第三方登录功能

news/2024/5/19 9:07:35/文章来源:https://blog.csdn.net/weixin_35732157/article/details/112339867

今日干货

df4c9fc664d0c4e6417b06add3d3e93a.png刚刚发表查看:66666回复:666

公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货。

OAuth2 和小伙伴们已经聊了很多了,咱们来一个实际点的案例练练手。

这里我才用 GitHub 来做第三方登录。

为什么是 GitHub 呢?有两方面考虑:

  1. 程序员基本上都有 GitHub 账号,测试方便。
  2. 国内的无论 QQ、微信、微博等,都需要注册审核,很费时间。
  3. 流程都是一样的,会做 GitHub 第三方登录,就会做 QQ 第三方登录。

当然,本系列前面几篇文章还是建议小伙伴们先看一下,这样可以更好的理解本文。

  1. 做微服务绕不过的 OAuth2,松哥也来和大家扯一扯
  2. 这个案例写出来,还怕跟面试官扯不明白 OAuth2 登录流程?
  3. 死磕 OAuth2,教练我要学全套的!
  4. OAuth2 令牌还能存入 Redis ?越玩越溜!
  5. 想让 OAuth2 和 JWT 在一起愉快玩耍?请看松哥的表演
  6. 最近在做 Spring Cloud 项目,松哥和大家分享一点微服务架构中的安全管理思路
  7. Spring Boot+OAuth2,一个注解搞定单点登录!

好了,不废话,我们开始今天的案例。

1.准备工作

首先登录自己的 GitHub 账户,右上角点击个人面板,选择 Settings:

bd095fa4ebe0fb0e53501bbc2cd35787.png

然后点击左边菜单底部的 Developer settings:

7c99431756f659973829d3737478ac24.png

然后选择 OAuth Apps,点击 Register a new application 按钮:

f168cdda54a188bc72523dfcb2975c4c.png

接下来注册你的应用信息

2e4ed5b3988d92d5a6475b2f3be30f30.png

从上往下,依次是你的项目名称、首页地址、项目描述、授权成功回调地址。信息填完之后,点击下方的 Register application 按钮完成注册。

注册完成之后,我们就可以获取到一个 Client ID 和一个 Client Secret,这就是我们登录时客户端的凭据。

c4faf5c48317d278f8d582d47d104259.png

这两个信息保存好,不要外泄。

写到这里,松哥不由得感叹一句,还是国外的应用香啊,用 GitHub 做第三方登录,一分钟不到,准备工作就完成了,用 QQ 做,我的资料已经提交两天了,目前的状态还是审核中。。。不过我也理解腾讯所面临的监管问题。

2.创建应用

接下来我们来简单创建一个自己的网站,我们依然使用 Spring Boot 项目,添加如下依赖:

72b561660c1f9bd937bf4503a20d977d.png

然后我们在 resources/templates 目录下创建一个简单的 index.html:

<body>
<p>hello 欢迎来到江南一点雨的小站!p>
<div>
    社交账号登录:<a href="https://github.com/login/oauth/authorize?client_id=xxxxxx&state=javaboy">
        <svg t="1587352912571" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"p-id="2196" width="32" height="32">
            <path d="M512 42.666667A464.64 464.64 0 0 0 42.666667 502.186667 460.373333 460.373333 0 0 0 363.52 938.666667c23.466667 4.266667 32-9.813333 32-22.186667v-78.08c-130.56 27.733333-158.293333-61.44-158.293333-61.44a122.026667 122.026667 0 0 0-52.053334-67.413333c-42.666667-28.16 3.413333-27.733333 3.413334-27.733334a98.56 98.56 0 0 1 71.68 47.36 101.12 101.12 0 0 0 136.533333 37.973334 99.413333 99.413333 0 0 1 29.866667-61.44c-104.106667-11.52-213.333333-50.773333-213.333334-226.986667a177.066667 177.066667 0 0 1 47.36-124.16 161.28 161.28 0 0 1 4.693334-121.173333s39.68-12.373333 128 46.933333a455.68 455.68 0 0 1 234.666666 0c89.6-59.306667 128-46.933333 128-46.933333a161.28 161.28 0 0 1 4.693334 121.173333A177.066667 177.066667 0 0 1 810.666667 477.866667c0 176.64-110.08 215.466667-213.333334 226.986666a106.666667 106.666667 0 0 1 32 85.333334v125.866666c0 14.933333 8.533333 26.88 32 22.186667A460.8 460.8 0 0 0 981.333333 502.186667 464.64 464.64 0 0 0 512 42.666667"fill="#2c2c2c" p-id="2197">path>
        svg>
    a>
div>
<div>国际站:<a href="http://www.javaboy.org">javaboy.orga>div>
<div>国内站:<a href="http://www.itboyhub.com">itboyhub.coma>div>
body>

这就是一个简单的 HTML 页面,页面上有一个 GitHub 的图标,点击这个图标,就可以去 GitHub 上完成授权操作,注意授权的链接如下:

  • https://github.com/login/oauth/authorize

这个授权需要携带一个 client_id 参数,这个 client_id 就是准备工作中获取到的 client_id,另外一个 state 则是用来防止跨站脚本攻击的,state 参数的值可以自己随意填写。

我们来看下页面的效果图:

eb30f55a770b5c8f24085f4b12a7a796.png

当我们点击 GitHub 图标,完成授权操作之后,会自动跳转到我们在准备工作填的回调地址中,并且携带一个 code 参数,拿着这个 code 参数我们就可以去获取 access_token 了,有了 access_token 我们就可以获取到用户信息了。

因此,我们再来添加一个 /authorization_code 接口,如下:

@GetMapping("/authorization_code")
public String authorization_code(String code) {
    Map map = new HashMap<>();
    map.put("client_id", "xxx");
    map.put("client_secret", "xxxx");
    map.put("state", "javaboy");
    map.put("code", code);
    map.put("redirect_uri", "http://localhost:8080/authorization_code");
    Map resp = restTemplate.postForObject("https://github.com/login/oauth/access_token", map, Map.class);
    System.out.println(resp);
    HttpHeaders httpheaders = new HttpHeaders();
    httpheaders.add("Authorization", "token " + resp.get("access_token"));
    HttpEntity> httpEntity = new HttpEntity<>(httpheaders);
    ResponseEntity exchange = restTemplate.exchange("https://api.github.com/user", HttpMethod.GET, httpEntity, Map.class);
    System.out.println("exchange.getBody() = " + exchange.getBody());return "forward:/index.html";
}

在 authorization_code 接口中,我们首先向 http://localhost:8080/authorization_code 发起请求去获取 access_token,注意我们需要的参数,client_id 和 client_secret 使我们第一步准备工作申请到的。获取到 access_token 的数据格式如下:

{access_token=9f33730ef09b74943a1cf7d8f9c0e567b9286829, token_type=bearer, scope=}

可以看到,有 access_token,有 token_type,也有 scope。

接下来,拿着 access_token ,将 access_token 放在请求头里边,我们就可以去调用 https://api.github.com/user 接口获取用户信息了,获取到的用户信息格式如下:

{
    "login":"lenve",
    "id":35444368,
    "node_id":"MDQ6VXNlcjM1NDQ0MzY4",
    "avatar_url":"https://avatars3.githubusercontent.com/u/35444368?v=4",
    "gravatar_id":"",
    "url":"https://api.github.com/users/lenve",
    "html_url":"https://github.com/lenve",
    "followers_url":"https://api.github.com/users/lenve/followers",
    "following_url":"https://api.github.com/users/lenve/following{/other_user}",
    "gists_url":"https://api.github.com/users/lenve/gists{/gist_id}",
    "starred_url":"https://api.github.com/users/lenve/starred{/owner}{/repo}",
    "subscriptions_url":"https://api.github.com/users/lenve/subscriptions",
    "organizations_url":"https://api.github.com/users/lenve/orgs",
    "repos_url":"https://api.github.com/users/lenve/repos",
    "events_url":"https://api.github.com/users/lenve/events{/privacy}",
    "received_events_url":"https://api.github.com/users/lenve/received_events",
    "type":"User",
    "site_admin":false,
    "name":null,
    "company":null,
    "blog":"",
    "location":null,
    "email":null,
    "hireable":null,
    "bio":null,
    "public_repos":2,
    "public_gists":0,
    "followers":1,
    "following":1,
    "created_at":"2018-01-15T06:05:04Z",
    "updated_at":"2020-04-20T03:00:49Z"
}

好了,用户的 GitHub 信息现在已经获取到了,接下来该存数据库就存数据库,该接入自己的登录流程就接入。

如此之后,我们就完成了第三方登录功能,其实还是非常 Easy 的,只要大家把这个流程走通,以后想接入微信登录、QQ 登录,都将是非常容易的事情。

本文案例下载地址:https://github.com/lenve/oauth2-samples

好了,本文就先说这么多,有问题欢迎留言讨论。

今日干货

df4c9fc664d0c4e6417b06add3d3e93a.png刚刚发表查看:13500回复:135

公众号后台回复 SpringBoot,免费获取 274 页SpringBoot修炼手册。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_844824.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求导数(导数计算器)网站 Derivative Calculator

Derivative Calculator 比如求x的平方的导数, 输入pow(x, 2), 点击go. 点击go, 然后会生成如下结果&#xff0c;包括了响应的函数图形.

LaTex常用技巧7:常用网站(公式和表格编辑器)

本文记录了本人编辑LaTex表格和公式常用的网站&#xff1a; 表格编辑器公式编辑器表格编辑器 网站1&#xff1a; 表格 编辑和生成器 支持LaTex Markdown多种格式 跟Markdown LaTex csv sql等和表格相关的都可以在这个网站里面找到。TableConvert 网站2&#xff1a; Tables G…

一个包含简明教程的网站:cheat-sheets.org

你听过Cheat-Sheets.org吗&#xff1f;在这里可以看到各种简明教程&#xff0c;包含了大部分的编程语言&#xff0c;C、C#、Jave、Python、sql、html、css、matlab、qt、mfc、shell、R……甚至还有photoshop、illustrator各种快键键汇总&#xff0c;真的短小精悍&#xff01;&a…

科研英文写作常用网站【持续更新】

1. bing词典 https://www.bing.com/dict?FORMZ9LHS4 例句很丰富。还没有广告。 2.英语表达同义替换 2.1 https://kmcha.com/similar 2.2 https://synonym.wordhippo.com/ 2.3 https://www.powerthesaurus.org/

太强了?京东大咖10年经验汇总:亿级流量网站核心架构笔记

经历过“双11”和“618”的同学都知道&#xff0c;在大促时如何保证系统的高并发、高可用是非常重要的事情。因此在备战大促时&#xff0c;有些通用原则和经验可以帮助我们在遇到高并发时&#xff0c;构建更可用的系统&#xff0c;如限流、降级、水平扩展和隔离解耦等。通过这些…

服务器论坛有哪些_网站降权常见的处理方法都有哪些?

要说在网站优化过程中害怕出现的情况&#xff0c;降权就是其中的一个&#xff0c;要知道网站降权会导致网站流量大幅度下降&#xff0c;关键词排名消失等现象&#xff0c;那么大家是否了解网站降权常见的处理方法都有哪些吗?1.网站服务器的稳定性在网站优化的过程中大家都会了…

【技巧】用手机访问局域网内Apache网站

写在前面 之前不知道还有这么一个技巧&#xff0c;以前手机真机测试webApp都是开电脑的WiFi&#xff0c;然后在手机里开启代理来访问这个网站。这样对设备的依赖性比较大&#xff0c;试想哪天没带笔记本电脑&#xff0c;或者在没有WiFi发射器的台式机里怎么用这个方式&#xf…

网站备案地点选择_建设项目环境影响登记表(备案)操作指南 (汽修行业收藏版)...

汽修行业示例一、请在取得营业执照后按照以下步骤进行备案操作■1、打开上海市生态环境局网站(http://sthj.sh.gov.cn)&#xff0c;点击首页中部“网上办事大厅”■2、点击“建设项目环境影响登记表备案”下方的“在线办理”■3、认真阅读各项告知信息和《建设项目环境影响登记…

[软件测试] - No.5 Linux 下使用 xampp搭建ecshop网站

一、安装配置xampp 1. 在linux系统中&#xff0c;百度xampp&#xff0c;下载linux版本。下载并提取后的文件如图所示&#xff1a; 2. 在终端中执行 上述命令&#xff0c;启动xampp 安装界面&#xff0c;一直点击next至安装成功&#xff1a; 3.安装成功以后&#xff0c;切换到/…

搭建个人网站

许久没有更博了&#xff0c;当初开博的时候还是一个刚保研的大四学生&#xff0c;如今已是研究生毕业两年&#xff0c;混迹银行业的IT码农&#xff0c;生活还算如意&#xff0c;追求不止于此&#xff0c;2016年初终于发布了自己首个个人网站&#xff0c;写篇文章分享网站的技术…

apache2.4在本地打开laravel项目_开源导航网站-WebStack-Laravel

前言&#xff1a;因为工作&#xff0c;需要使用的网站比较多&#xff0c;所以一直想为公司搭建一款私有的导航网站。本来想自己写&#xff0c;可是不会前端呀。只好去github上看看有没有大神分享的开源导航网站。虽然不太好找但还是找到了。项目地址&#xff1a;https://github…

阿里云免费https 宝塔配置,网站不可访问

阿里云申请我就不说了&#xff0c;百度一大把 宝塔配置也不说了&#xff0c;google一大把 建议有能力用google或者bing 有两点会导致无法访问 1、你用了cdn&#xff0c;当然这个我没遇到&#xff0c;因为我没有cdn 2、需要去你阿里云账号里面安全规则里面添加一个新规则就是s…

git在线学习网站,建议收藏

idea的git操作用的多了&#xff0c;发现居然命令也越来越生疏了&#xff0c;这不无意间发现了一个可以在线学习git命令的网站&#xff0c;感觉还不错&#xff0c;跟玩游戏似的&#xff0c;还是一关一关的&#xff0c;分享给大家&#xff1a; https://learngitbranching.js.org…

在线学习go语言的网站,建议收藏

一个可以在线学习go语言的网站&#xff0c;地址如下&#xff1a; https://tour.go-zh.org/welcome/1可能打开会慢一点&#xff0c;多等一会

android 字体像素转换工具类_这11个工具类网站,简直是工作学习的效率神器,在知乎上点赞过万...

大家好&#xff0c;这里是秋叶PPT~不久前&#xff0c;曾和大家分享了一些办公效率的工具&#xff0c;已经有了上万的收藏量&#xff0c;看来大家对工具类内容情有独钟呀&#xff01;今天&#xff0c;再推荐11个工具类网站&#xff0c;个个精品&#xff0c;每一个都值得深度体验…

不同网站可共用一个服务器吗,不同域名的网站能在一个服务器吗

不同域名的网站能在一个服务器吗 内容精选换一换一个网站可以绑定多个域名。注册多个不同的域名&#xff0c;并且将这些域名绑定到同一个网站上&#xff0c;可以让互联网访问者更容易找到该网站&#xff0c;增加网站的推广效果。不过需要注意的是&#xff0c;一个网站绑定多个域…

小红书头部品牌SEO布局曝光,热搜词详情-相关品牌上线!

小红书美妆热搜词“皮肤” 以热搜词排行榜TOP20上榜率73%登顶年度热搜词TO1。选对热搜词是种草营销的第一步&#xff0c;我们总结了选取和布局热搜词的策略供大家参考。 01 . 精准捕捉 最新热搜词和长期流量词 最新热搜词 是小红书用户某一段时间内最为关心的内容&#xff0c…

一个文艺的在线生成漂亮的二维码工具网站

之前使用的草料二维码生成的二维码是黑白的&#xff0c;简单大方&#xff1a;https://cli.im/最近业务需要&#xff0c;为游乐场的场馆做二维码以供需求&#xff0c;为了符合场馆的设计风格&#xff0c;考虑到后期贴在展馆展示牌上面的二维码也需要美化一下&#xff0c;来符合其…

有哪些好的刷题网站?2017年最受欢迎的编程挑战网站

程序猿&#xff08;ID&#xff1a;imkuqin&#xff09; 猿妹编译编译自&#xff1a;https://medium.freecodecamp.org/the-10-most-popular-coding-challenge-websites-of-2016-fb8a5672d22f 编程几乎已经成为了人类所知每个行业的必要组成部分&#xff0c;如今有越来越多的人开…

48个网站模板资源免费领取

为了感恩大家长久以来的关注和支持&#xff0c;小编准备了一些福利&#xff0c;整理了包含前端&#xff0c;Java&#xff0c;产品经理&#xff0c;微信小程序&#xff0c;Python&#xff0c;网站源码&#xff0c;Android应用视频教程&#xff0c;微信公众平台开发教程及材料等资…