1.在谷歌控制台创建客户端信息

https://console.cloud.google.com/auth/clients

注:在重定向的url中一定要是https开头的。

创建完成之后主要获取三个信息

clientID、secret、redirctUrl

 2.配置pom

<dependency>
    <groupId>com.google.auth</groupId>
    <artifactId>google-auth-library-oauth2-http</artifactId>
    <version>0.22.2</version>
</dependency>
<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.32.1</version>
</dependency>

3.获取跳转授权的url

clientID:谷歌控制台创建的

public static String getLoginUrl(){
        String scope = "openid email profile";
        String redirectUri = "https://www.baidu.com";
        String authUrl = "https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=%s&redirect_uri=%s&scope=%s";
        return String.format(authUrl, clientId, redirectUri, scope);
    }

4.接收code,获取accessToken

这个地方需要如果只是自己测试可以直接将重定向的地址,配置成获取code的地址,如果是正式环境我的方案是配置前端的页面,然后有前端将code传给后端。

注意:由于是跳转,code会被转义,自己测试的时候注意decode。

private static String tokenEndpoint = "https://oauth2.googleapis.com/token";
public static String checkCode(String code){
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("client_id", clientId);
        params.add("client_secret", clientSecret);
        params.add("code", code);
        params.add("redirect_uri", "https://www.baidu.com");
        params.add("grant_type", "authorization_code");

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<Map> response = restTemplate.postForEntity(tokenEndpoint, request, Map.class);
        String accessToken = (String) response.getBody().get("access_token");
        return accessToken;
    }

5.根据accessToken获取用户信息

private static String userInfoEndpoint = "https://www.googleapis.com/oauth2/v3/userinfo";
public static Map getUserInfo(String accessToken){
        HttpHeaders userInfoHeaders = new HttpHeaders();
        userInfoHeaders.setBearerAuth(accessToken);
        HttpEntity<String> userInfoRequest = new HttpEntity<>(userInfoHeaders);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<Map> userInfoResponse = restTemplate.exchange(userInfoEndpoint, HttpMethod.GET, userInfoRequest, Map.class);
        Map<String, Object> userInfo = userInfoResponse.getBody();

        String googleId = (String) userInfo.get("sub");
        String email = (String) userInfo.get("email");
        String name = (String) userInfo.get("name");
        String picture = (String) userInfo.get("picture");
        return userInfo;
    }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐