我正在练习使用google drive / sheets / oauth API Java作为独立应用程序。
我现在的重点是客户端身份验证。 我在google开发者控制台上注册了我的应用程序并获得了客户端json文件。
因此,在the tutorial之后,这是代码的身份验证片段
/** Directory to store user credentials for this application. */
private static final java.io.File DATA_STORE_DIR = ResourceLoader.googleCredentials();
/** Global instance of the {@link FileDataStoreFactory}. */
private static DataStoreFactory DATA_STORE_FACTORY;
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT;
/** Global instance of the scopes required by this quickstart.
*
* If modifying these scopes, delete your previously saved credentials
* at ~/.credentials/drive-java-quickstart
*/
private static final List<String> SCOPES =
Arrays.asList(DriveScopes.DRIVE);
static {
try {
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
} catch (Throwable t) {
MyLogger.getLogger().severe(t);
}
}
/**
* Creates an authorized Credential object.
* @return an authorized Credential object.
* @throws IOException
*/
private Credential authorize() throws IOException {
// Load client secrets.
//InputStream in = GDriveQuickStart.class.getResourceAsStream("/client_secret.json");
Credential credential = null;
InputStream in = new FileInputStream(ResourceWorking.googleClientSecretPath());
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
MyLogger.getLogger().info(clientSecrets.getDetails().toPrettyString());
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("offline")
.build();
credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
MyLogger.getLogger().info(credential.getAccessToken()+" "+credential.getRefreshToken()+" "+credential.getExpirationTimeMilliseconds()+" "+credential.getExpiresInSeconds());
return credential;
}
当应用程序第一次运行时,它会打开一个浏览器页面,供Google用户进行身份验证并接受条件条款。 然后,凭据将保存到由`DATA_STORE_DIR(tipically .credentials / StoredCredential二进制文件)标识的文件夹中。
通过这种方式,再次运行应用程序可以避免浏览器页面打开:您始终是经过身份验证的。
所以,我希望此Stored Credentials
有一个到期时间,因此,例如,在一个月后,浏览器页面会再次打开,Stored Credential
将被覆盖。
检查最后一个日志行:访问令牌的生命周期仅为一小时,但是当它到期时,它会自动刷新。
我找到的唯一方法是使用MemoryDataStoreFactory
而不是FileDataStoreFactory
,但每次应用程序运行时都会以这种方式打开浏览器页面。
那么,Google API
是否有办法获取临时Stored Credential
?
我解释了为什么我想要它:应用程序将被不同的用户使用。我想避免在用户复制应用程序文件夹并将其提供给其他用户时发生的严重情况。凭证文件夹位于应用程序文件夹中,因此他也将复制StoredCredential
文件。新用户将使用具有旧用户身份验证的应用程序。
答案 0 :(得分:1)
我解释了为什么我想要它:应用程序将被不同的用户使用。我想避免在用户复制应用程序文件夹并将其提供给其他用户时发生的严重情况。凭证文件夹位于应用程序文件夹中,因此他也将复制StoredCredential文件。新用户将使用具有旧用户身份验证的应用程序。
这实际上非常重要,你不想冒险泄露用户信息。但是你还需要考虑到你不能保护自己免受愚蠢用户所做的一切。
出于这个原因,.Net Client Library默认将FileDataStore保存为%appdata%。 Java客户端库和.net客户端库的设计非常相似,以至于我可以对此有所帮助。
您需要做的只是将您的凭据存储在主应用程序文件夹的旁边我不确定您运行的系统是什么,但%appdata%适用于Windows。这种方式,如果用户复制目录,他们不会偶然复制您的凭证文件。
另一种选择是制作您自己的数据存储实现,并可能添加某种检查,以便在创建它们时使用机器的mac地址,只在同一台机器上加载它们。如果你问我,这有点过分了。