Google people API - 仅使用访问令牌在 Java 服务器上获取数据在前端完成身份验证

问题描述

我必须在我的应用程序中实现以下流程:

  1. 用户通过谷歌在移动应用上进行身份验证
  2. 移动应用将用户 accesstoken 发送到后端
  3. 使用 accesstoken 创建凭据对象以用于创建 People Api 服务
  4. 后端获取电子邮件、姓名和生日以将其保存到数据库中。

现在,我的范围有问题,发生以下异常:

"获取https://people.googleapis.com/v1/people/me/connections?personFields=birthdays { “代码”:403, “错误”:[{ “域”:“全局”, "message" : "权限不足",“原因”:“权限不足” }],"message" : "请求的身份验证范围不足。",“状态”:“PERMISSION_DENIED” }"

这并不奇怪,因为事实上,我不知道在不再次启动登录过程的情况下我可以在哪里设置范围(在后端我只得到令牌,没有用户凭据)。到目前为止,这是我的代码


public Optional<SocialProfileDto> findByToken(String token) {
        PeopleService service = null;
        
        try {
            service = getPeopleService(token);
        } catch (GeneralSecurityException e) {
            e.printstacktrace();
        } catch (IOException e) {
            e.printstacktrace();
        }
        
        try {
            ListConnectionsResponse connectionsResponse = service
                    .people()
                    .connections()
                    .list("people/me")
                    .set("personFields","birthdays")
                    .execute();
            connectionsResponse.getTotalPeople();
        } catch (IOException e1) {
            e1.printstacktrace();
        }
        
        return null;
    }

private PeopleService getPeopleService(String token) throws GeneralSecurityException,IOException {
        Credential credential = null;
        credential = createCredentialWithAccesstokenOnly(getToken(token));

        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

        PeopleService service = new PeopleService.Builder(HTTP_TRANSPORT,JSON_FACTORY,credential).
                .setApplicationName(APPLICATION_NAME).build();

        return service;
    }

private TokenResponse getToken(String token) {
        TokenResponse tokenResponse = new TokenResponse();
        tokenResponse.setAccesstoken(token);
        tokenResponse.setTokenType("Bearer");
        tokenResponse.setExpiresInSeconds(3599L);
        tokenResponse.setScope("https://www.googleapis.com/auth/user.birthday.read https://www.googleapis.com/auth/user.phonenumbers.read https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
        return tokenResponse;
    }

    public static Credential createCredentialWithAccesstokenOnly(TokenResponse tokenResponse) {
        return new Credential(BearerToken.authorizationHeaderAccessMethod()).setFromTokenResponse(tokenResponse);
    }

问题:该流程甚至可以实施吗?如果是这样,那么我可以在哪里设置范围?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)