Java实现Google第三方登录

news2024/11/28 12:33:16

文章目录

  • 前言
  • 一、了解OAuth2.0
  • 二、注册开发者账号
    • 1.登录开发者平台
    • 2.创建应用
  • 三、代码实现
    • 1.实现流程
      • 1.点击登录
      • 2.接受回调中的code获取accessToken
      • 3.获取用户信息
    • 2.注意事项

前言

Google API 使用 OAuth 2.0 协议进行身份验证和授权。Google 支持常见的 OAuth 2.0 场景,例如网络服务器、客户端、已安装的应用和输入有限的设备应用。

首先,从 Google API Console 获取 OAuth 2.0 客户端凭据。然后,您的客户端应用会从 Google 授权服务器请求访问令牌,从响应中提取令牌,然后将该令牌发送到您要访问的 Google API。

国内访问google需要架梯子。请自行准备好,不然会出现api超时的情况

一、了解OAuth2.0

官方文档:https://developers.google.com/identity/protocols/oauth2
在这里插入图片描述

二、注册开发者账号

1.登录开发者平台

登录Google的开发者平台,创建账号 https://developers.google.com/
在这里插入图片描述

2.创建应用

官方地址:https://console.developers.google.com/apis/credentials

  1. 创建凭据
    在这里插入图片描述
    选择OAuth客户端ID,创建完成后会看到客户端id和客户端秘钥(妥善保存,代码中要用)
    在这里插入图片描述
    如果那个重定向的地址没看懂的话往后看代码就理解了,然后定义同意屏幕,是用户授权登录时看到的页面

在这里插入图片描述
到此,应用就创建完成了

三、代码实现

登录开发者平台 https://developers.google.com/ 然后跟着截图一步一步往下走
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://developers.google.com/identity/choose-auth
在这里插入图片描述
先照着官网写个页面体验一下,直接复制粘贴就可以https://developers.google.com/identity/sign-in/web/
在这里插入图片描述
体验完之后到guides页面,将基本的四部参照文档完成https://developers.google.com/identity/sign-in/web/devconsole-project
在这里插入图片描述
上面的四步是web页面,下面做后台验证https://developers.google.com/identity/choose-auth
在这里插入图片描述
在这里插入图片描述
上面的5步做完之后来这找获取用户信息的API(我做的时候这个接口找的很费劲)
在这里插入图片描述
获取用户信息选这个
在这里插入图片描述
想查询请求url点第二个红框,requestUrl会自动填充(这一步就是想找到获取用户信息的Url,获取到url就可以在后台调用接口了)
在这里插入图片描述

1.实现流程

  1. 用户点击google登录跳转到google登录页面
  2. google回调地址会给我们一个code我们取到code获取accessToken
  3. 根据accessToken再去调用userInfoApi获取用户信息。并根据googleId和自己的业务关联
  4. 最后返回登录状态给前端

1.点击登录

点击google登录触发
此处就是拼接一个google登录地址也可以用后端实现

const handleClickGoogle=()=>{
  const url="https://accounts.google.com/o/oauth2/v2/auth?" +
      "scope=https%3A//www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile%20openid&" +
      "access_type=offline&" +
      "include_granted_scopes=true&" +
      "response_type=code&" +
      "redirect_uri=回调地址"+
      "client_id=谷歌clientId &" +
      "state=可以添加参数用于回调接受"
  window.location.href=url
}

之后会跳转google登录

2.接受回调中的code获取accessToken

public void getGoogleAccessToken(String code) {
	        MultiValueMap params = new LinkedMultiValueMap<>();
        params.add("client_id", clientId);
        params.add("redirect_uri", redirectUrl);
        params.add("client_secret", clientSecret);
        params.add("grant_type", "authorization_code");
        params.add("code", form.getCode());
        WebClient client=WebClient.create();
        client = getWebClient(client, isProxy, proxyHost, proxyPort);
        //获取google access_token
        Mono<GoogleTokenDto> googleTokenDtoMono = client
                .post()
                .uri(googleTokenUrl)
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                .body(BodyInserters.fromFormData(params))
                .retrieve()
                .bodyToMono(GoogleTokenDto.class);
		     System.out.println(googleTokenDtoMono.block());
	}

3.获取用户信息

public static voidgetUserInfo(String accessToken) {
	String url = "https://oauth2.googleapis.com/tokeninfo?id_token="+accessToken;
	WebClient client=WebClient.create();
	Mono<String> stringMono = client.get().uri(url).retrieve().bodyToMono(String.class);
}

2.注意事项

我这里使用的是WebClient调用的接口

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

实体对象
GoogleTokenDto

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
public class GoogleTokenDto {

    @JsonProperty("access_token")
    private String accessToken;

    @JsonProperty("expires_in")
    private long expiresIn;

    private String scope;

    @JsonProperty("token_type")
    private String tokenType;

    @JsonProperty("id_token")
    private String idToken;
}

GoogleDto

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoogleDto {
    private String error;
    @JsonProperty("error_description")
    private String errorDescription;
    /**
     * token签发者,值为https://accounts.google.com或者accounts.google.com
     */
    private String iss;
    private String nbf;
    /**
     * client_id
     */
    private String aud;
    /**
     * 用户在该Google应用中的唯一标识,类似于微信的OpenID
     */
    private String sub;
    /**
     * 用户邮箱
     */
    private String email;
    /**
     * 邮箱是否已验证
     */
    @JsonProperty("email_verified")
    private String emailVerified;
    private String azp;
    /**
     * 用户名
     */
    private String name;
    /**
     * 用户头像
     */
    private String picture;
    /**
     * 名
     */
    @JsonProperty("given_name")
    private String givenName;
    /**
     * 姓
     */
    @JsonProperty("family_name")
    private String familyName;
    /**
     * 签发时间
     */
    private String iat;
    /**
     * 过期时间
     */
    private String exp;
    private String jti;
    private String alg;
    private String kid;
    private String type;
}

如果出现了访问超时。需要架梯子。
webclient需要配置代理。具体就要根据自己的梯子配置

    public static WebClient getWebClient(WebClient client, int isProxy, String proxyHost, int proxyPort) {
        if(isProxy ==0){
            HttpClient httpClient = HttpClient.create()
                    .tcpConfiguration(tcpClient ->
                            tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).host(proxyHost).port(proxyPort)));
            ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
            client = WebClient.builder().clientConnector(connector).build();
        }
        return client;
    }

本文参考https://blog.csdn.net/manongxiaomei/article/details/67633655

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高分子点击试剂DBCO-PEG-Hydrazide,二苯并环辛炔-聚乙二醇-酰基

一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DBCO-PEG-Hydrazide属于高分子点击试剂&#xff0c;“点击化学"一般由叠氮化物&#xff08;azide&#xff09;和炔烃&#xff08;alkyne&#xff09;作用形共价键&#…

老港综合填埋场二期配套渗滤液工程电能管理系统的设计和应用-Susie 周

1、概述 本项目为老港综合填埋场二期配套渗滤液工程电能管理系统。根据配电系统管理的要求&#xff0c;需要对&#xff08;老港综合填埋场二期配套渗滤液工程电能管理系统项目的配电柜进行电能管理&#xff0c;以保证用电的安全、可靠。 Acrel-3000电能管理系统充分利用了现代…

Mybatis源码分析(一)Mybatis 基本使用

目录一 知识回顾1.1 简介1.2 其他二 基本使用官网&#xff1a;mybatis – MyBatis 3 | 简介 一 知识回顾 1.1 简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作…

图片怎么转换成excel文档?

当我们创建excel文档中&#xff0c;里面无疑是需要各种表格内容&#xff0c;而如果是我们一个一个编辑起来&#xff0c;这就会比较繁琐。而现在许多需求可以通过网络很容易地得到满足。比如有把图片转换成excel表格的需求。下载一个小工具&#xff0c;这就相当方便了&#xff0…

不愧是阿里资深架构师,这本“分布式架构笔记”写得如此透彻明了

前言&#xff1a; Mybatis 是一款优秀的持久层框架。其封装了 JDBC 操作&#xff0c; 免去了开发人员编写 JDBC 代码以及设置参数和获取结果集的重复性工作。通过编写简单的 XML 或 Java 注解即可映射数据库 CRUD 操作。本文介绍的是阿里资深架构师十年经验整理&#xff0c;My…

JAVA 中的注解可以继承吗?

前言 注解想必大家都用过&#xff0c;也叫元数据&#xff0c;是一种代码级别的注释&#xff0c;可以对类或者方法等元素做标记说明&#xff0c;比如 Spring 框架中的Service&#xff0c;Component等。那么今天我想问大家的是类被继承了&#xff0c;注解能否继承呢&#xff1f;…

基于springboot在线答疑系统

教师权限&#xff1a;首页、个人中心、疑难解答管理、试卷管理、试题管理、考试管理。 学生权限&#xff1b;首页、个人中心、问题发布管理、疑难解答管理、考试管理等功能模块的管理维护等操作&#xff0c;系统结构图如下图4-1所示。 图4-1 系统功能图 截图 目 录 摘 要 I …

[附源码]Node.js计算机毕业设计扶贫产品展销平台小程序Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

matlab 的help没了

前两天还正常用&#xff0c;今天输入help 关键字 回复是没有相关的内容。 解决办法&#xff1a; 按照如下选择就行了 然后输入 help help 就会有显示了 help - Help for functions in Command Window This MATLAB function displays the help text for the functionalit…

大数据MapReduce学习案例:倒排索引

文章目录一&#xff0c;案例分析&#xff08;一&#xff09;倒排索引介绍&#xff08;二&#xff09;案例需求二&#xff0c;案例实施&#xff08;一&#xff09;准备数据文件&#xff08;1&#xff09;启动hadoop服务&#xff08;2&#xff09;虚拟机上创建文本文件&#xff0…

数据结构双向链表

双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 那…

WPF入门第三篇 ControlTemplate、Trigger与Storyboard

ControlTemplate、Trigger与Storyboard ControlTemplate通常用在Style中&#xff0c;Trigger通常作为ControlTemplate的一部分&#xff0c;StoryBoard表示动画效果&#xff0c;下面将通过对Button按钮设置这几项来简单说明这几项的用法。 在MainWindow中添加一个Button按钮&am…

Prometheus技术分享——如何监控宿主机和容器

这一期主要来跟大家聊一下&#xff0c;使用node_exporter工具来暴露主机和因公程序上的指标&#xff0c;利用prometheus来监控宿主机&#xff1b;以及通过通过Cadvisor监控docker容器。 一、部署node_exporter监控宿主机 1 下载软件包 wget https://github.com/prometheus/n…

分布式链路追踪SkyWalking

文章目录目录介绍服务端搭建注册中心启动注册中心修改持久化配置UI服务配置启动服务客户端搭建目录介绍 重要的目录结构分析如下&#xff1a; agent&#xff1a;客户端需要指定的目录&#xff0c;其中有一个jar&#xff0c;就是负责和客户端整合收集日志bin&#xff1a;服务端…

深入理解Linux网络技术内幕(十三)——协议处理函数

文章目录前言网络协议栈概论大蓝图Ethernet的链路层的选择&#xff08;LLC和SNAP&#xff09;网络协议栈的操作方式执行正确的协议处理函数特殊媒介封装协议处理函数的组织协议处理函数的注册Ethernet与IEEE 802.3帧设置封包类型设置Ethernet协议及长度逻辑链接控制&#xff08…

python+django球鞋商品竞拍卖网站vue

管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入网上球鞋竞拍系统 管理员登录进入网上球鞋竞拍系统可以查看球鞋分类管理、热门竞拍管理、科比展区管理、用户管理、竞拍信息管理、消息通知管理、用户评价管理、…

单人脸的关键点检测

闲暇之余做了一个简单的单人的脸部关键点检测&#xff0c;使用的pytorch框架&#xff0c;别人训练好的现成模型。其中人脸检测模型是YOLOface5&#xff08;onnx格式的权重&#xff09;&#xff0c;关键点检测模型是PFLD&#xff08;能检测98个关键点&#xff09;&#xff0c;是…

计算机网络学习笔记(Ⅳ):网络层

目录 1 网络层内容 1.1 功能概述 1.任务 2.主要功能 1.2 数据交换方式 1.电路交换 2.报文交换 3.分组交换 4.方法对比 1.3 分组交换 1.数据报方式 2.虚电路方式 3.对比 2 路由算法与路由协议 2.1 路由算法 2.2 路由选择协议 3 IPv4 3.1 IP数据报格式 1.TCP/…

快2023年了,还不会性能调优?阿里技术官亲授“Java性能调优技术宝典”看完直接涨薪5K

一、前言 什么是性能调优&#xff1f; 性能调优其实很好理解&#xff0c;就是优化硬件、操作系统、应用之间的一个充分的协作&#xff0c;最大化的发挥出硬件的极致性能&#xff0c;来应对高负载的业务需求。 为什么需要性能优化&#xff1f; 其实说到底就是两个原因&#…

2023年湖北安全员ABC三类人员延期多久一次?甘建二

2023年湖北安全员ABC三类人员延期多久一次&#xff1f; 2023年湖北安全员ABC延期快来找甘建二报名&#xff0c;建设厅指定的 2023年湖北安全员ABC新办快来找甘建二报名&#xff0c;建设厅指定的 首先安全员分为三类&#xff1a;A证、B证、C证&#xff0c;每个证书都有相应的…