成功通过身份验证后如何使用 google-api 获取用户信息?

Posted

技术标签:

【中文标题】成功通过身份验证后如何使用 google-api 获取用户信息?【英文标题】:How to get userinfo with google-api after succesfully been authenticated? 【发布时间】:2013-05-23 12:59:57 【问题描述】:

我在使用 gmail 帐户成功验证后尝试获取用户信息(tok 是有效令牌):

        GoogleCredential credential2 = new GoogleCredential.Builder()
                .setTransport(TRANSPORT).setJsonFactory(JSON_FACTORY)
                .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
                .setRequestInitializer((new HttpRequestInitializer() 
                    @Override
                    public void initialize(HttpRequest request)
                            throws IOException 
                        request.getHeaders().setAuthorization("Bearer ".concat(tok));
                    
                ))
                .build();

        Oauth2 userInfoService = new Oauth2.Builder(TRANSPORT,
                JSON_FACTORY, credential2.getRequestInitializer())
                .setApplicationName(APPLICATION_NAME).build();

        Userinfo userInfo = userInfoService.userinfo().get().execute();
        logger.warn("User email: ", userInfo.getEmail());
        logger.warn("User gender: ", userInfo.getGender());
        logger.warn("User complet name:  - ", userInfo.getFamilyName(), userInfo.getName());

但日志显示所有字段为'null',返回的json数据只包含id:


 "id": "113695880661351193041"

我应该做什么?添加一个特殊的范围来做到这一点?我试了几次都没有成功,只是添加了scope=https://www.googleapis.com/auth/userinfo.profile作为url参数,也许是错的?

希望有人可以帮助或知道如何为我的请求添加范围并从该服务获得正确的响应。

【问题讨论】:

【参考方案1】:

这对我有用:

Credential credential = OAuth2Utils.newFlow().loadCredential(userId);

Oauth2 service = new Oauth2.Builder(OAuth2Utils.HTTP_TRANSPORT, OAuth2Utils.JSON_FACTORY, credential).setApplicationName("appname").build();

UserInfo userInfo = service.userinfo().get().execute();

这些是返回的一些属性:

userInfo.getBirthday()

userInfo.getFamilyName()

userInfo.getGender()

userInfo.getGivenName()

userInfo.getHd()

userInfo.getLink()

代码中提到的实用类OAuth2Utils

/** Global instance of the HTTP transport. */
public final static HttpTransport HTTP_TRANSPORT = new UrlFetchTransport();

/** Global instance of the JSON factory. */
public final static com.google.api.client.json.JsonFactory JSON_FACTORY = new com.google.api.client.json.jackson2.JacksonFactory();

public static GoogleAuthorizationCodeFlow newFlow() throws IOException 
    return new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, getClientCredential(),
            Arrays.asList(SCOPES)).setCredentialStore(new OAuth2CredentialStore()).setAccessType("offline")
            .setApprovalPrompt("force").build();

【讨论】:

以上是关于成功通过身份验证后如何使用 google-api 获取用户信息?的主要内容,如果未能解决你的问题,请参考以下文章

成功 IMC 身份验证后 Worklight 身份验证错误 401

成功 NodeJS 身份验证后使用 Nginx 提供静态内容

成功登录后 SwiftUI Firebase 身份验证关闭视图

如何使用 Laravel Passport (5.3) 记录身份验证尝试

IBM Worklight:基于适配器的身份验证成功后未获得响应

成功身份验证后,Flutter Firebase 数据库权限被拒绝