使用 Google Drive Oauth 2.0 管理访问令牌

Posted

技术标签:

【中文标题】使用 Google Drive Oauth 2.0 管理访问令牌【英文标题】:Managing Access Token with Google Drive Oauth 2.0 【发布时间】:2014-04-15 12:38:13 【问题描述】:

我正在使用 Google API Java 客户端来管理从 Java 中的 Google App Engine 对 Google Drive API 的访问。

我获得了一个用户访问令牌和刷新令牌,并将两者都保存在我们的数据库中。虽然,我认为只有刷新令牌需要持久化。

如何管理访问令牌过期?您如何看待这种策略:

登录到 Web 应用程序后,我会从刷新令牌中获取访问令牌并将其存储在会话中。如何从存储在数据库中的刷新令牌创建 Google 凭据对象?

当我访问 Drive 操作时,如果过期,我会捕获 401 异常以重新创建 Access Token

我已经阅读了有关 Credential and Credential Store 的信息,但它似乎已被弃用。现在必须使用它:StoredCredential。有人有使用这个新界面的示例吗?

谢谢。

【问题讨论】:

迭戈,你终于解决了吗?因为我因为过期而被困在同一个例外上。 嗨,你怎么了? ^^ 嗨,我想创建一个凭据对象给定我存储在我的数据存储区中的刷新令牌,以便在不向用户询问新授权的情况下刷新过期的 AccessToken(在后台这样做)。我想你看了一下这个例子:developers.google.com/drive/web/examples/java 因为我正在使用它。 /** 用我的旧令牌重建 GoogleCredential 对象 / GoogleCredential credentials = new GoogleCredential.Builder() .setClientSecrets(clientId, clientSecret) .setJsonFactory(JSON_FACTORY).setTransport(HTTP_TRANSPORT)。 build() .setRefreshToken(user.getOAuth2RefreshToken()).setAccessToken(user.getOAuth2AccessToken()); /* 我刷新访问令牌,然后,我得到它*/ credentials.refreshToken(); newAccess = credentials.getAccessToken(); 抱歉,我无法标记我的评论:s 【参考方案1】:

如果您使用 Drive API 库,它会为您处理 401 异常,只要您给它一个带有访问和刷新令牌的凭据。

以下是使用 StoredCredential 构建 Credential 对象的方法。您可以使用不同于MemoryDataStoreFactory 的实现:

public class ApiCredentialManager 
    private DataStore<StoredCredential> dataStore;
    
        //Put your scopes here
        public static String[] SCOPES_ARRAY =  "https://www.googleapis.com/auth/admin.directory.user" ;
    
        private ApiCredentialManager() 
    
            try 
                dataStore = MemoryDataStoreFactory.getDefaultInstance().getDataStore("credentialDatastore");
             catch (IOException e) 
                throw new RuntimeException("Unable to create in memory credential datastore", e);
            
        
    
        public static ApiCredentialManager getInstance() 
            if (instance == null)
                instance = new ApiCredentialManager();
    
            return instance;
        
    
        public Credential getCredential(String username) throws Exception 
            try 
                GoogleCredential credential = new GoogleCredential.Builder()
                        .setTransport(new NetHttpTransport())
                        .setJsonFactory(new JacksonFactory())
                        .addRefreshListener(
                                new DataStoreCredentialRefreshListener(
                                        username, dataStore))
                        .build();
                
                if(dataStore.containsKey(username))
                    StoredCredential storedCredential = dataStore.get(username);
                    credential.setAccessToken(storedCredential.getAccessToken());
                    credential.setRefreshToken(storedCredential.getRefreshToken());
                else
                    //Do something of your own here to obtain the access token.
                    //Most usually redirect the user to the OAuth page
                
                
                return credential;
             catch (GeneralSecurityException e) 
                throw new Exception("isuue while setting credentials", e);
             catch (IOException e) 
                e.printStackTrace();
                throw new Exception("isuue while setting credentials", e);
            
        
        
        //Call this when you've obtained the access token and refresh token from Google
        public void saveCredential(String username, Credential credential)
            StoredCredential storedCredential = new StoredCredential();
            storedCredential.setAccessToken(credential.getAccessToken());
            storedCredential.setRefreshToken(credential.getRefreshToken());
            dataStore.set(username, storedCredential);
        

【讨论】:

嗨大卫,您的示例是否使用刷新令牌自动获取新的访问令牌?...正如我试图在***.com/questions/24117748/… 的问题中提出的但没有回应:-( @Aerox 是的,因为 java 中的驱动 api 客户端会在需要时自动刷新令牌。 在后台运行吗?无需每次都询问用户是否允许新的 OAuth? 是的,假设您在开始时有一个刷新令牌。

以上是关于使用 Google Drive Oauth 2.0 管理访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

具有多个用户帐户的Google Drive SDK OAuth2

如何通过 Google Drive 和 App Engine SDK 使用 Oauth2 服务帐户

Google Drive OAuth2 - 对回调和重定向 URI 感到困惑

Google Drive API、Oauth 和服务帐号

将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController

Google Drive API Python 服务帐户示例