- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 Google token 转换为 json 字符串格式并将该字符串存储在数据库中。
现在在谷歌驱动器中上传文件时,我想在 GoogleWebAuthorizationBroker.AuthorizeAsync 方法中发送该 json 以获取用于获取 DriveService 的凭据。
因此我可以创建一个后台任务来检查 token 并自动上传文件而无需用户交互。我也可以使用该凭证创建新的 json 文件并保存在数据库中,这样如果访问 token 更新,它可以自动存储。
UserCredential credential;
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "",
ClientSecret = ""
},
new[] { DriveService.Scope.Drive },
Page.User.Identity.Name,
CancellationToken.None).Result;
string json = JsonConvert.SerializeObject(credential.Token);
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Test",
});
我做的对吗?或者有没有其他方法可以将凭据保存在数据库中而不是保存在文件中?
最佳答案
假设我对你的理解是正确的,你正在将刷新 token 保存到数据库中,并希望稍后使用它来访问 API。
您应该做的是仅存储刷新 token ,然后创建您自己的 idatastore 实现来加载它。目前您正在使用 filedatastore,它将在存储在 %appdata% 中的文件中查找它
我这里有一堆例子database datastores但这里是 Entity Framework 的,因为你还没有说你正在使用哪个数据库。
using Google.Apis.Json;
using Google.Apis.Util.Store;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace GoogleAuthDataStores
{
public class GoogleUserCredential
{
[Key]
public int ID { get; set; }
[Required, Index(IsUnique = true), StringLength(500)]
public string Key { get; set; }
[Required]
public string Credentials { get; set; }
}
internal class EntityFrameworkDataStore : DbContext, IDataStore
{
public DbSet<GoogleUserCredential> GoogleUserCredentials { get; set; }
/// <summary>The string used to open the connection.</summary>
public virtual string ConnectionString { get; set; }
/// <summary>
/// Creates a new table in the data base if the Users table does not exist within the database used in the connectionstring.
/// </summary>
/// <param name="connectionString">The string used to open the connection.</param>
public EntityFrameworkDataStore(string connectionString) : base(connectionString)
{
ConnectionString = connectionString;
}
/// <summary>
/// Stores the given value for the given key. It creates a new row in the database with the user id of
/// (primary key <see cref="GenerateStoredKey"/>) in <see cref="GoogleUserCredentials"/>.
/// </summary>
/// <typeparam name="T">The type to store in the data store.</typeparam>
/// <param name="key">The key.</param>
/// <param name="value">The value to store in the data store.</param>
Task IDataStore.StoreAsync<T>(string key, T value)
{
if (string.IsNullOrEmpty(key))
{
throw new ArgumentException("Key MUST have a value");
}
var serialized = NewtonsoftJsonSerializer.Instance.Serialize(value);
save(GenerateStoredKey(key), serialized);
return Task.Delay(0);
}
/// <summary>
/// Deletes the given key. It deletes the <see cref="GenerateStoredKey"/> row in
/// <see cref="GoogleUserCredentials"/>.
/// </summary>
/// <param name="key">The key to delete from the data store.</param>
Task IDataStore.DeleteAsync<T>(string key)
{
if (string.IsNullOrEmpty(key))
{
throw new ArgumentException("Key MUST have a value");
}
try
{
var hold = GoogleUserCredentials.Where(a => a.Key == key).FirstOrDefault();
GoogleUserCredentials.Remove(hold);
SaveChangesAsync();
}
catch (System.Data.SqlClient.SqlException ex)
{
throw new Exception("Failed to delete credentials", ex);
}
return Task.Delay(0);
}
/// <summary>
/// Returns the stored value for the given key or <c>null</c> if the matching row (<see cref="GenerateStoredKey"/>
/// in <see cref="GoogleUserCredentials"/> doesn't exist.
/// </summary>
/// <typeparam name="T">The type to retrieve.</typeparam>
/// <param name="key">The key to retrieve from the data store.</param>
/// <returns>The stored object.</returns>
Task<T> IDataStore.GetAsync<T>(string key)
{
if (string.IsNullOrEmpty(key))
{
throw new ArgumentException("Key MUST have a value");
}
TaskCompletionSource<T> tcs = new TaskCompletionSource<T>();
var user = GetUserByKey(GenerateStoredKey(key));
if (user != null)
{
try
{
tcs.SetResult(NewtonsoftJsonSerializer.Instance.Deserialize<T>(user.Credentials));
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}
else
{
tcs.SetResult(default(T));
}
return tcs.Task;
}
/// <summary>
/// Clears all values in the data store. This method deletes all files in <see cref="GoogleUserCredentials"/>.
/// </summary>
Task IDataStore.ClearAsync()
{
try
{
foreach (var item in GoogleUserCredentials)
{
GoogleUserCredentials.Remove(item);
}
}
catch (System.Data.SqlClient.SqlException ex)
{
throw new Exception("Failed to clear credentials", ex);
}
return Task.Delay(0);
}
/// <summary>
/// Checks if the user exists <see cref="GenerateStoredKey"/>.
/// </summary>
private GoogleUserCredential GetUserByKey(string key)
{
try
{
var user = GoogleUserCredentials.Where(a => a.Key == key).FirstOrDefault();
if (user != null)
return user;
return null;
}
catch (System.Data.SqlClient.SqlException)
{
return null;
}
}
/// <summary>
/// Save the credentials. If the user <see cref="GenerateStoredKey"/> does not exists we insert it other wise we will do an update.
/// </summary>
/// <param name="key"></param>
/// <param name="serialized"></param>
private void save(string key, string serialized)
{
try
{
var user = GoogleUserCredentials.Where(a => a.Key == key).FirstOrDefault();
if (user == null)
{
var hold = new GoogleUserCredential { Key = key, Credentials = serialized };
GoogleUserCredentials.Add(hold);
}
else
{
var aUser = this.GoogleUserCredentials.Where(a => a.Key == key).FirstOrDefault();
aUser.Credentials = serialized;
}
SaveChanges();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>Creates a unique stored key based on the key and the current project name.</summary>
/// <param name="key">The object key.</param>
public static string GenerateStoredKey(string key)
{
return string.Format("{0}-{1}", Assembly.GetCallingAssembly().GetName().Name, key);
}
}
}
关于c# - 如何在 .Net 的 GoogleWebAuthorizationBroker.AuthorizeAsync 方法中发送存储为 json 字符串(在数据库中)的 Google 驱动 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52045751/
我正在学习 C#(为 Windows Phone 开发),并且我正在尝试对我的用户进行身份验证以进入 Google 的帐户。我正在使用这段代码: https://developers.google.c
我尝试使用 youtube api v3 和 .NET 将视频上传到 youtube,但它会永远挂起调用 AuthorizeAsync。您还可以在以下位置查看代码:https://developers
GoogleWebAuthorizationBroker.AuthorizeAsync() 在(农场,4.5 NET)暂存服务器上失败,但在本地服务器上运行良好。我已按照帮助热线上的每个代码进行操作,
我们的网站需要从后台代码(asp.net mvc 应用程序)上传视频到youtube。我正在尝试获取 google 凭据,但是当我调用 AuthorizeAsync 时,应用程序只是挂起。我到处寻找解
我有一个 C# .net Web 应用程序,用于将视频上传到 Youtube。这在大约 6 个月前有效,但现在已停止工作。当我在本地计算机上通过 Visual Studio 启动网站时,以下代码挂起:
我正在编写一个 C# 桌面应用程序,可以将其输出复制到用户的 Google 云端硬盘。但是,当我尝试使用 GoogleWebAuthorizationBroker.AuthorizeAsync() 授
我正在尝试使用 Google Calendar API在我的非 MVC .NET Web 应用程序中。 (这似乎是一个重要的区别。) 我尝试使用来自 this example 的代码在谷歌和 this
我有一个使用 adsense api 的报告应用程序。 我正在使用 GoogleWebAuthorizationBroker.AuthorizeAsync 进行身份验证。 当我在本地使用它时,它工作正
我在将我的代码发布到 IIS7.0 后遇到 GoogleWebAuthorizationBroker.AuthorizeAsync 超时问题。 通过我的开发环境,一切都按预期工作。我看到了 Googl
我无法尝试从 MVC 应用程序访问特定的 Google 云端硬盘帐户。我所需要的只是让 MVC 网络应用程序访问我的谷歌驱动器扫描一些文件并根据谷歌驱动器的内容更改数据库。问题是在 IIS 中运行时,
我正在尝试使用 Azure 托管 Web 应用程序执行 OAuth2,但我无法使用服务帐户(此处有许多可用的解决方案,但它们都坚持服务帐户/证书),而我需要用户由 Google 进行身份验证和授权。
我正在尝试使用 Azure 托管 Web 应用程序执行 OAuth2,但我无法使用服务帐户(此处有许多可用的解决方案,但它们都坚持服务帐户/证书),而我需要用户由 Google 进行身份验证和授权。
服务器设置: ASP.NET 表单在 .net 4.5.1 集成管道上运行,在服务器 2012 上的 iis8 上运行。 我正在尝试从谷歌的 GoogleWebAuthorizationBroker
我想将 login_hint 附加到对 Google 的身份验证请求中。我正在使用以下代码: FileDataStore fDS = new FileDataStore(Logger.Folder,
当在 Windows 10 桌面/移动设备上运行时,此代码在我的 UWP 应用程序中运行良好,但在 Xbox One 上我收到错误: 我的 C# 代码: credential = await Goog
我在尝试让 MVC5 应用程序在部署时与 Google Mirror API(或与此相关的任何 Google API)一起工作时遇到了一个奇怪的问题。 这是我努力工作的代码: UserCredenti
我正在使用 GoogleWebAuthorizationBroker.AuthorizeAsync() 为 GoogleDrive 授权用户。 它适用于控制台或 UI 应用程序,但如果该方法在 Win
环境:.net 4.5.1 集成管道上的 ASP.NET 简单 Web 应用程序在服务器 2012 上的 iis8 上运行,不遵循 MVC。 我正在尝试从谷歌的 GoogleWebAuthorizat
我正在将 Google token 转换为 json 字符串格式并将该字符串存储在数据库中。 现在在谷歌驱动器中上传文件时,我想在 GoogleWebAuthorizationBroker.Autho
我遇到了与这个问题完全相同的问题: How do I set return_uri for GoogleWebAuthorizationBroker.AuthorizeAsync? 但是,这个问题在
我是一名优秀的程序员,十分优秀!