使用 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 感到困惑
将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController