Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring exchange google用户信息访问令牌_Java_Spring_Spring Boot_Spring Security Oauth2_Google Oauth - Fatal编程技术网

Java Spring exchange google用户信息访问令牌

Java Spring exchange google用户信息访问令牌,java,spring,spring-boot,spring-security-oauth2,google-oauth,Java,Spring,Spring Boot,Spring Security Oauth2,Google Oauth,我正在尝试为我的网站实现google身份验证,它是React前端和Spring Boot REST后端 对于我的React应用程序,我发现一个库提供了一个Google登录按钮,我可以在其中指定我的应用程序的“客户端id”,并在Google开发者控制台中注册,其余的(将用户重定向到Google身份验证页,检索访问令牌/id令牌)由该库完成 现在我想把这个访问令牌发送到我的后端,用它向google发出请求,以验证这个前端用户是一个真正的google用户,通过向google显示这个访问令牌来正确验证并

我正在尝试为我的网站实现google身份验证,它是React前端和Spring Boot REST后端

对于我的React应用程序,我发现一个库提供了一个Google登录按钮,我可以在其中指定我的应用程序的“客户端id”,并在Google开发者控制台中注册,其余的(将用户重定向到Google身份验证页,检索访问令牌/id令牌)由该库完成

现在我想把这个访问令牌发送到我的后端,用它向google发出请求,以验证这个前端用户是一个真正的google用户,通过向google显示这个访问令牌来正确验证并获取这个用户的数据(我只想要email/name/sub,这是用户唯一的google id)。我是在找一个库来交换这个谷歌访问令牌的用户数据吗

我还感到困惑的是,所有oauth教程都说,当用户在google页面上进行身份验证时,我的应用程序将收到一个授权代码,但正如我所说,我的前端会收到acces令牌和id令牌。是因为我使用的图书馆吗?这是图书馆

这是当用户在google页面上进行身份验证时,进入我的客户端应用程序的数据


谢谢

我和你有同样的问题。我用谷歌的GoogleIdTokenVerifier解决了这个问题。设置起来非常简单

这是我的代码:

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

@RestController
@RequestMapping(value = "/api/authenticate")
public final class AuthenticationController {

    @GetMapping
    public String exchange(@Autowired NetHttpTransport transport, @Autowired GsonFactory factory, HttpServletRequest request) throws GeneralSecurityException, IOException, IllegalAccessException {
        // get id_token from Authorization Bearer
        String token = this.getTokenFromRequest(request);

        // Create verifier
        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, factory)
                .setAudience(Collections.singletonList(<CLIENT_ID_HERE>))
                .build();

        // Verify it
        GoogleIdToken idToken = verifier.verify(token);
        if (idToken == null) {
            throw new IllegalAccessException("Invalid id_token");
        }
        // Access payload 
        System.out.println("Email: " + idToken.getPayload().getEmail());
    }

    public String getTokenFromRequest(HttpServletRequest request) throws IllegalAccessException {
        String token = request.getHeader("Authorization");
        String[] parts = token.split(" ");
        if (parts.length != 2 || !parts[0].contains("Bearer")) {
            throw new IllegalAccessException("Authorization Bearer format invalid. <Bearer {token}>");
        }
        return parts[1];
    }
}
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
导入com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
导入com.google.api.client.http.javanet.NetHttpTransport;
导入com.google.api.client.json.gson.GsonFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.web.bind.annotation.*;
导入javax.servlet.http.HttpServletRequest;
导入java.io.IOException;
导入java.security.GeneralSecurityException;
导入java.util.Collections;
@RestController
@请求映射(value=“/api/authenticate”)
公共最终类AuthenticationController{
@GetMapping
公共字符串交换(@Autowired NetHttpTransport、@Autowired GsonFactory、HttpServletRequest请求)引发GeneralSecurityException、IOException、IllegaAccessException{
//从授权承载器获取id\u令牌
字符串令牌=this.getTokenFromRequest(请求);
//创建验证器
GoogleIdTokenVerifier verifier=新的GoogleIdTokenVerifier.Builder(运输,工厂)
.setAudience(Collections.singletonList())
.build();
//核实一下
GoogleIdToken=验证器。验证(令牌);
if(idToken==null){
抛出新的IllegalAccessException(“无效id_令牌”);
}
//访问有效载荷
System.out.println(“Email:+idToken.getPayload().getEmail());
}
公共字符串getTokenFromRequest(HttpServletRequest请求)引发IllegalAccessException{
字符串标记=request.getHeader(“授权”);
String[]parts=token.split(“”);
如果(parts.length!=2 | |!parts[0]。包含(“承载人”)){
抛出新的IllegalAccessException(“授权承载格式无效”);
}
退货零件[1];
}
}
Maven依赖项:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.30.4</version>
</dependency>

<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client-gson</artifactId>
    <version>1.21.0</version>
</dependency>

com.google.api-client
谷歌api客户端
1.30.4
com.google.http-client
谷歌http客户端gson
1.21.0