手把手教你实现Java第三方应用登录

目录
  • 什么是OAuth2.0
  • 申请网站接入
  • 创建SpringBoot应用
  • 实现登录流程

大家在自己做项目的时候有没有想过实现一个第三方应用登录呢?类似这种:

本篇文章就来聊一聊该如何实现第三方应用登录。

什么是OAuth2.0

OAuth是一项协议,它为用户资源的授权提供了一个安全、开放而简易的标准,OAuth的授权不会使第三方触及到用户的账号信息(比如密码),因此OAuth是相对安全的。而OAuth2.0就是OAuth的延续,不过2.0更加关注客户端开发者的简易性。

申请网站接入

常见的第三方应用都支持第三方登录,比如:QQ、微信、微博、GitHub、Gitee等,要想申请第三方登录权限,就需要去到对应的平台,比如QQ,搜索QQ开放平台:

进入应用管理,并创建应用即可:

不过对于QQ、微信、微博等的网站接入都需要身份认证,过程比较繁琐,所以我们使用Gitee作为第三方应用进行接入。

首先打开Gitee,选择设置:

在设置中选择第三方应用:

点击创建应用并填写相关信息:

应用名称可以随意填写,但是下面的两个地址就有用途了,对于应用主页,它需要填写的是当前应用的主页,而应用回调接口填写的是当登录成功后需要跳转的页面。

创建SpringBoot应用

申请完成后,就可以来创建SpringBoot应用,并新建一个index.html页面:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <form>
      用户名:<input type="text"/><br/>
      密码:<input type="password"/><br/>
      <a href="">Gitee登录</a>
      <input type="submit" value="登录"/><br/>
    </form>
  </body>
</html>

效果如下:

页面很丑,但不重要,实现功能即可。

现在我们的需求是点击Gitee登录链接,会跳转至一个第三方的登录页面,就像这样:

那么该如何实现呢?

回到Gitee中,在创建完应用后,将页面拖动到下方,会看到模拟请求按钮:

点击一下该按钮,会进行一个模拟登录:

地址栏中的地址就是我们需要跳转的页面,将地址复制下来:

https://gitee.com/oauth/authorize?client_id=52908197466cd3008db76a6018de66c8d222656056fa78b26dd58d1f4fa0a606&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsuccess&response_type=code

里面总共有3个参数,分别是:

  • client_id
  • redirect_uri
  • response_type

其中client_id在创建完应用之后便会提供给我们:

也就是地址上的内容,而redirect_uri是在点击了同意授权按钮之后需要跳转的页面,即:登录成功之后,需要跳转至成功后的页面,最后是response_type,它表示响应类型为一个授权码。

来了解一下授权码的作用,当用户点击了同意授权按钮之后,Gitee服务器会给redirect_uri指向的页面传递一个授权码,此时就可以接收到这个授权码,再去换取AccessToken,只有获取到了AccessToken,才能够获取到Gitee中当前用户的某些信息。

点击了同意授权按钮后:

得到了授权码后,通过该地址能够换取AccessToken:

https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}

该地址要求以Post形式请求,使用PostMan测试一下,将参数按要求设置好:

得到相应结果:

{
  "access_token": "cd2c33c3fe548a23188159f87da70110",
  "token_type": "bearer",
  "expires_in": 86400,
  "refresh_token": "c95a38ab2357638ffc4dc6f09c623f2333e0930a37dec8e2f191a40d7afd3514",
  "scope": "user_info",
  "created_at": 1627974370
}

得到了AccessToken之后,就可以获取到用户在Gitee中已经授权的任何信息了。

整个授权认证的过程如下图所示:

实现登录流程

熟悉了整合流程之后,我们用代码来实现一下,首先修改页面:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <form>
      用户名:<input type="text"/><br/>
      密码:<input type="password"/><br/>
      <a href="https://gitee.com/oauth/authorize?client_id=52908197466cd3008db76a6018de66c8d222656056fa78b26dd58d1f4fa0a606&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsuccess&response_type=code">Gitee登录</a>
      <input type="submit" value="登录"/><br/>
    </form>
  </body>
</html>

现在超链接的地址经过修改后就能成功跳转至Gitee授权页面了,因为授权成功后跳转的地址为 http://localhost:8080/success ,所以需要来处理一下这个请求,创建一个控制器:

@Controller
public class LoginController {

    @GetMapping("/success")
    public String login(@RequestParam("code") String code){
        System.out.println(code);
        return "success";
    }

    @GetMapping("/")
    public String index(){
        return "index";
    }
}

当授权成功后我们让其跳转至success.html页面,并接收Gitee传递过来的授权码,所以创建success.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <h1>登录成功!</h1>
  </body>
</html>

启动项目测试一下:

点击同意授权后确实登录成功了,控制台也输出了授权码:

e907fd92d8392ebcd72dff321da45115ff0fba2dec0e6918b233ec7d03b76e5d

其实到这里登录流程还没有结束,因为如果使用第三方应用登录的话,平台会使用第三方应用的一些信息,比如账号、头像等直接作为当前平台的登录名和头像,所以我们还需要获取用户在Gitee中的一些信息。

此处参考Gitee的API文档:

比如获取授权用户的资料信息:

它需要传递一个access_token作为参数,那我们要做的就是使用授权码去得到access_key:

@Controller
public class LoginController {

    @GetMapping("/success")
    public String login(@RequestParam("code") String code, Map<String,String> map) {
        // 获取accesskey
        String accessKey = getAccessKey(code);
        System.out.println(accessKey);
        // 通过accessKey获取用户信息
        String userInfo = getUserInfo(accessKey);
        // 取出用户名
        String name = (String) JSONObject.parseObject(userInfo).get("name");
        // 取出头像
        String avatar_url = (String) JSONObject.parseObject(userInfo).get("avatar_url");
        // 放入请求域
        map.put("name",name);
        map.put("avatar_url",avatar_url);
        return "success";
    }

    /**
     * 获取用户信息
     */
    private String getUserInfo(String accessKey) {
        String json = "";
        OkHttpClient client = new OkHttpClient();
        // 通过该地址能够获取到用户信息
        String url = "https://gitee.com/api/v5/user?access_token=" + accessKey;
        Request request = new Request.Builder()
                .get()
                .url(url).build();
        try {
            Response response = client.newCall(request).execute();
            json = response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return json;
    }

    /**
     * 获取AccessKey
     */
    private String getAccessKey(String code) {
        OkHttpClient client = new OkHttpClient();
        // 通过该地址能够获取到access_token
        String url = "https://gitee.com/oauth/token";
        // 封装请求参数
        RequestBody requestBody = new FormBody.Builder()
                .add("grant_type", "authorization_code")
                .add("code", code)
                .add("client_id", "52908197466cd3008db76a6018de66c8d222656056fa78b26dd58d1f4fa0a606")
                .add("redirect_uri", "http://localhost:8080/success")
                .add("client_secret", "7e84401a9752e88d22d5450c1687ca6a19bc34f45fe3452cefd33312d8153978")
                .build();

        Request request = new Request.Builder()
                .post(requestBody)
                .url(url).build();
        String accessKey = "";
        try {
            Response response = client.newCall(request).execute();
            String json = response.body().string();
            // 获取json串中的access_token属性
            accessKey = (String) JSONObject.parseObject(json).get("access_token");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return accessKey;
    }

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

success.html页面需要显示用户信息:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <h1>登录成功!</h1>
    <h1>用户名:<span th:text="${#request.getAttribute('name')}"></span></h1>
    <img th:src="${#request.getAttribute('avatar_url')}">
  </body>
</html>

效果如下:

事实上,登录流程远没有这么简单,当用户取消授权时就不能让其登录,程序里还没有加上这类判断,对于从未注册过的用户来说,这次登录就相当于一次注册,所以还需要以Gitee中用户的某些信息作为注册信息进行登录,当已经注册过的用户使用第三方登录时,要让其正常登录。

到此这篇关于手把手教你实现Java第三方应用登录的文章就介绍到这了,更多相关Java第三方应用登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 原生java代码实现码云第三方验证登录的示例代码

    码云第三方验证登录 研究了QQ,码云,微信等第三方登录接口时,发现QQ以及微信第一步都需要验证授权管理,而且个人测试需要提供手持身份证一张,并且验证时间过长( 3天工作日左右吧 ),这样会非常浪费大家学习第三方接口登录的时间,终于, 在我的不屑努力下,找到了适合大家快速上手,测试第三方接口登录的平台-----码云(看网上帖子说某WX接入还要开发者认证,人民币300元) 码云链接地址 https://gitee.com/ 一.在码云上创建应用 1.在码云上注册一个账号,点击右上角设置 2.创建应用

  • Java实现QQ第三方登录的示例代码

    前期准备工作 1.云服务器 2.备案的域名 3.本地调试需要修改hosts文件,将域名映射到127.0.0.1 如何修改hosts文件:https://www.jb51.net/diannaojichu/319774.html 申请QQ互联,并成为开发者 申请QQ互联创建应用时需要备案域名,所以建议提前准备备案域名. QQ互联:https://connect.qq.com/index.html 登录后,点击头像,进入认证页面,填写信息,等待审核. 审核通过后创建应用 应用创建通过审核后,就可以使

  • 第三方网站微信登录java代码实现

    前两个星期在公司中的项目加上了微信登录.绑定的功能,在这里做个记录! 一.开发前知识 1.微信开放平台与微信公众平台的区别 1.1 微信公众平台: ① 地址:https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN ② 微信公众平台面向的是普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能. 1.2

  • Java接入支付宝授权第三方登录的完整步骤

    开发前准备 支付宝开发平台. 支付宝沙箱环境申请使用 !!!重点 授权回调地址必须要写全路径也就是controller最终路径(下面有具体细节) RSA2的密钥生成: 支付宝提供生成密钥地址. 获取用户授权 生成唤起支付宝授权连接 用到appid+回调路径 回调路径=在上面配置的全路径 具体路径: https://openauth.alipay.com/oauth2/publicAppAuthorize.htm? app_id=2016####&scope=auth_user&edirec

  • 手把手教你实现Java第三方应用登录

    目录 什么是OAuth2.0 申请网站接入 创建SpringBoot应用 实现登录流程 大家在自己做项目的时候有没有想过实现一个第三方应用登录呢?类似这种: 本篇文章就来聊一聊该如何实现第三方应用登录. 什么是OAuth2.0 OAuth是一项协议,它为用户资源的授权提供了一个安全.开放而简易的标准,OAuth的授权不会使第三方触及到用户的账号信息(比如密码),因此OAuth是相对安全的.而OAuth2.0就是OAuth的延续,不过2.0更加关注客户端开发者的简易性. 申请网站接入 常见的第三方

  • 手把手教你用Java实现一套简单的鉴权服务

    前言 时遇JavaEE作业,题目要求写个简单web登录程序,按照老师的意思是用servlet.jsp和jdbc完成.本着要么不做,要做就要做好的原则,我开始着手完成此次作业(其实也是写实训作业的用户鉴权部分),而之前写项目的时候也有相关经验,这次正好能派上用场. 一.何为鉴权服务 引用百度百科的话说 鉴权(authentication)是指验证用户是否拥有访问系统的权利. 鉴权包括两个方面: 用户鉴权,网络对用户进行鉴权,防止非法用户占用网络资源. 网络鉴权,用户对网络进行鉴权,防止用户接入了非

  • 手把手教你使用Java实现在线生成pdf文档

    目录 一.介绍 二.案例实现 2.1添加iText依赖包 2.2简单实现 2.3复杂实现 2.4变量替换方式 三.总结 一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查看.打印或者下载. 例如下图的电子发票! 熟悉这块业务的童鞋,一定特别清楚,目前最常用的解决方案是:把相关的数据信息,通过一些技术手段生成对应的 PDF 文件,然后返回给用户,以便

  • 教你用Java验证服务器登录系统

    一.前言 代码全部由自己所写,作者是一名小白请多多包涵,如果代码有什么不好的地方大佬们可以指出问题 单独写一个这样简易的登录是因为比较方便,由于我尝试了多次在写好的程序内直接写这个登录系统测试,很麻烦.不方便,所以单独写出了这套代码,个人觉得这样把写好的程序放进去修改就比较方便多了 二.登录系统服务端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerLogin {

  • 手把手教你实现漂亮的Qt 登录界面

    前言 最近在使用Qt5,Qt Creator做一个管理系统类的项目,自然需要用到登录界面,故记录一下登录界面的制作.其中一些功能的实现也得益于之前Qt5基础视频不规则窗口部分的学习. 手把手教你实现漂亮的登录界面 首先看一下成品. 第一步.新建一个Qwidget项目 没必要用qmainwindow,不需要那些菜单,一般用qwidget就可以,注意勾选ui. 第二步.添加界面组件 1.添加容器 调整容器为合适大小,同时调整整个画布为合适大小. 2.添加按钮,标签,文字组件 构思: 账号密码部分使用

  • 手把手教你用Java给暗恋对象发送一份表白邮件

    目录 前言 ①创建项目 ②配置pom.xml  ④qq邮箱处理 ⑤发送邮件 附协议的基本介绍 总结 前言 如果你有喜欢的男生或者女生,想要有一个比较新颖的表白方式,作为一名合格的程序员,我们应该用我们自己独有的方式来表达,接下来我会一步一步教你用Java语言发送一份邮件,这是一种简易的方式,代码内容还可以继续扩张,废话不多说,让我们学起来吧!! ①创建项目 全程需要在连接网络的状态下进行 打开idea,File->New->Project    点击Maven->Next 创建名称-&g

  • 手把手教你导入Go语言第三方库

    目录 环境 环境变量 实践导包 最好的学习方式就是实践. 我们通过导入gin包来深入学习. 环境 go 1.13.5 goland 2019.3.1 manjaro-gnome3.34.2 环境变量 首先回想一下,我们安装goland的时候,设置了几个比较重要的环境变量,也就是GOROOT和GOPATH. GOROOT比较容易理解.也就是我们go语言的安装目录,标准库什么的就放在里面的.在linux中的话,默认安装到/usr/lib/go中,我们创建项目时选择的SDK也就是这个. GOPATH可

  • Java开发之手把手教你搭建企业级工程SSM框架

    目录 1.在IDEA界面中创建MavenWeb工程 2.在pom.xml中添加如下相关依赖 3.web.xml 配置 Spring MVC.Spring 4.分别在main目录下创建resource包 5.在spring.xml中连接数据库 6.springmvc.xml中配置驱动和前后缀表达式 7.配置打印sql语句和指定实体类,让idea搜索需要的javaBean 8.创建与数据库相对应的实体类 9.Handler 10.Service及其接口 11.Repository 12.测试所用的j

  • Android消息推送:手把手教你集成小米推送(附demo)

    前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 继承自Application类,其作用主要是:设置App的ID & Key.注册推送服务 DemoMessageReceiver类 继承自

随机推荐