如何使用 Xamarin 中现有的访问令牌来使用 Google Apis?
How to use Google Apis using existing Access Token in Xamarin?
我使用 Xamarin.auth 在我的 Xamarin 表单应用程序中成功实现了登录过程。现在我想连接到 Google APIs 并上传 AppData。这是我试过的代码,
我尝试使用令牌获取 Google 凭据并将此凭据提供给 Google API 但它失败了。
var store = AccountStore.Create();
var SavedAccount = store.FindAccountsForService(GoogleDriveBackup.Auth.Constants.AppName).FirstOrDefault();
GoogleCredential credential2 = GoogleCredential.FromAccessToken(SavedAccount.Properties["access_token"]);
var driveService = new Google.Apis.Drive.v3.DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential2,
ApplicationName = "myApp",
});
FilesResource.CreateMediaUpload request;
var filePath = Path.Combine(path, filename);
using (var stream = new System.IO.FileStream(filePath,
System.IO.FileMode.Open))
{
request = driveService.Files.Create(
fileMetadata, stream, "application/json");
request.Fields = "id";
request.Upload();
}
var file = request.ResponseBody;
request.ResponseBody 始终为空。我还以为跟凭据有关呢
我尝试使用
var store = AccountStore.Create();
var SavedAccount = store.FindAccountsForService(GoogleDriveBackup.Auth.Constants.AppName).FirstOrDefault();
var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "xxxx-xxx.apps.googleusercontent.com",
ClientSecret = "xxxxxxxx"
}
});
Google.Apis.Auth.OAuth2.Responses.TokenResponse responseToken = new Google.Apis.Auth.OAuth2.Responses.TokenResponse()
{
AccessToken = SavedAccount.Properties["access_token"],
ExpiresInSeconds = Convert.ToInt64(SavedAccount.Properties["expires_in"]),
RefreshToken = SavedAccount.Properties["refresh_token"],
Scope = DriveService.Scope.DriveAppdata,
TokenType = SavedAccount.Properties["token_type"],
};
var token= SavedAccount.Properties["access_token"];
var credential = new UserCredential(flow, "", responseToken);
但上述情况需要我没有的客户端密钥,因为我在 google 控制台中创建 "Android App" 并使用 ClientId 登录。所以我在某处读到我应该在 google 控制台中创建 "Others" 并从那里使用 ClientId 和 Client Secret 这对我来说没有多大意义,因为我使用不同的客户端 ID 登录。无论如何,我也尝试过,但响应为空。
那么这里的交易是什么?如何实现我的目标?
google.net 客户端库不支持 xamarin。我真的很惊讶你能做到这么远。您将遇到的主要问题是身份验证,因为您已经注意到 .net 客户端库的凭据类型将是浏览器、本机或 api 密钥。移动 (Android Ios) 客户端无法工作,因为您没有秘密,身份验证方法不同,客户端库无法执行此操作。
我唯一的建议是自己使用 xamarin 进行 Oauth2 身份验证,然后像现在一样构建 TokenResponse。如果您可以将 dll 放入您的项目,那么您可以将该令牌提供给 Google .net 客户端库。
据我所知,我们没有计划在不久的将来使用 Google .net clinet 库支持 xamarin,请参阅 984 840 1167
我使用 Xamarin.auth 在我的 Xamarin 表单应用程序中成功实现了登录过程。现在我想连接到 Google APIs 并上传 AppData。这是我试过的代码, 我尝试使用令牌获取 Google 凭据并将此凭据提供给 Google API 但它失败了。
var store = AccountStore.Create();
var SavedAccount = store.FindAccountsForService(GoogleDriveBackup.Auth.Constants.AppName).FirstOrDefault();
GoogleCredential credential2 = GoogleCredential.FromAccessToken(SavedAccount.Properties["access_token"]);
var driveService = new Google.Apis.Drive.v3.DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential2,
ApplicationName = "myApp",
});
FilesResource.CreateMediaUpload request;
var filePath = Path.Combine(path, filename);
using (var stream = new System.IO.FileStream(filePath,
System.IO.FileMode.Open))
{
request = driveService.Files.Create(
fileMetadata, stream, "application/json");
request.Fields = "id";
request.Upload();
}
var file = request.ResponseBody;
request.ResponseBody 始终为空。我还以为跟凭据有关呢
我尝试使用
var store = AccountStore.Create();
var SavedAccount = store.FindAccountsForService(GoogleDriveBackup.Auth.Constants.AppName).FirstOrDefault();
var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "xxxx-xxx.apps.googleusercontent.com",
ClientSecret = "xxxxxxxx"
}
});
Google.Apis.Auth.OAuth2.Responses.TokenResponse responseToken = new Google.Apis.Auth.OAuth2.Responses.TokenResponse()
{
AccessToken = SavedAccount.Properties["access_token"],
ExpiresInSeconds = Convert.ToInt64(SavedAccount.Properties["expires_in"]),
RefreshToken = SavedAccount.Properties["refresh_token"],
Scope = DriveService.Scope.DriveAppdata,
TokenType = SavedAccount.Properties["token_type"],
};
var token= SavedAccount.Properties["access_token"];
var credential = new UserCredential(flow, "", responseToken);
但上述情况需要我没有的客户端密钥,因为我在 google 控制台中创建 "Android App" 并使用 ClientId 登录。所以我在某处读到我应该在 google 控制台中创建 "Others" 并从那里使用 ClientId 和 Client Secret 这对我来说没有多大意义,因为我使用不同的客户端 ID 登录。无论如何,我也尝试过,但响应为空。 那么这里的交易是什么?如何实现我的目标?
google.net 客户端库不支持 xamarin。我真的很惊讶你能做到这么远。您将遇到的主要问题是身份验证,因为您已经注意到 .net 客户端库的凭据类型将是浏览器、本机或 api 密钥。移动 (Android Ios) 客户端无法工作,因为您没有秘密,身份验证方法不同,客户端库无法执行此操作。
我唯一的建议是自己使用 xamarin 进行 Oauth2 身份验证,然后像现在一样构建 TokenResponse。如果您可以将 dll 放入您的项目,那么您可以将该令牌提供给 Google .net 客户端库。
据我所知,我们没有计划在不久的将来使用 Google .net clinet 库支持 xamarin,请参阅 984 840 1167