.NET Google api 1.7 beta使用刷新令牌进行身份验证

时间:2014-01-08 22:22:52

标签: c# google-drive-api google-oauth google-api-dotnet-client

我一直在关注Oauth .Net Google Apis,以便通过OAuth进行身份验证并使用Google驱动Apis。

具体来说,我想使用我已存储的刷新令牌,以便使用它来实例化GoogleDrive服务。

我发现了样品 https://code.google.com/p/google-api-dotnet-client/source/browse/Tasks.SimpleOAuth2/Program.cs?repo=samples

似乎使用“GoogleWebAuthorizationBroker.AuthorizeAsync”,但我不确定如何使用该方法使用刷新令牌而不是您在此示例中提供的客户机密码。

4 个答案:

答案 0 :(得分:15)

如果我理解正确,您就会问如何根据现有的刷新令牌创建新的Google服务。

因此,您可以执行以下操作:

var token = new TokenResponse { RefreshToken = "YOUR_REFRESH_TOKEN_HERE" }; 
var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
    new GoogleAuthorizationCodeFlow.Initializer 
    {
      ClientSecrets = [your_client_secrets_here]
    }), "user", token);

然后您可以将凭据传递给服务的初始化程序。

通过执行上述操作, GoogleAuthorizationCodeFlow 将根据您刷新令牌和客户端机密获取新的访问令牌。

请注意,您必须在此处拥有客户机密,否则您将无法获得访问令牌。

答案 1 :(得分:0)

client_secrets.json包含客户端ID和客户端密钥(其中包含您的应用程序的OAuth 2.0信息)。

我认为本文将更好地解释如何使用OAuth 2.0访问Google Apps API,尤其是在构建Web应用程序时。

https://developers.google.com/accounts/docs/OAuth2WebServer

如果您对编码示例感兴趣,stackoverflow中有一个:Google+ API: How can I use RefreshTokens to avoid requesting access every time my app launches?

答案 2 :(得分:0)

GoogleWebAuthorizationBroker要求您在发送FileDatastore的情况下发送iDataStore的信息。 FileDataStore将数据存储在%appData%中。如果你想使用一个refreshtoken你保存在其他地方,你需要创建自己对iDataStore的限制。

实际数据存储的代码我有点长在这里发布。 http://daimto.com/google-oauth2-csharp/

然后就像使用FileDataStore

一样使用它
//Now we load our saved refreshToken.
StoredResponse myStoredResponse = new StoredResponse(tbRefreshToken.Text);
// Now we pass a SavedDatastore with our StoredResponse.
 using (var stream = new FileStream("client_secrets.json", FileMode.Open,
        FileAccess.Read))
  {
     GoogleWebAuthorizationBroker.Folder = "Tasks.Auth.Store";
     StoredCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
     GoogleClientSecrets.Load(stream).Secrets,
     new[] { DriveService.Scope.Drive,
     DriveService.Scope.DriveFile },
     "user",
      CancellationToken.None,
      new SavedDataStore(myStoredResponse)).Result;
     }

该教程附有一个示例项目。

答案 3 :(得分:0)

要使用刷新令牌:

var init = new GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "OAuth_Client_ID_From_GoogleAPI",
        ClientSecret = "OAuth_Client_Secret"
    },
    Scopes = new string[] {"MY_SCOPES"}
};
var token = new TokenResponse { RefreshToken = "MY_REFRESH_TOKEN" };
var credential = new UserCredential(new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(init), "", token);

//init your Google API service, in this example Google Directory
var service = new DirectoryService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "",
});

如果没有刷新令牌怎么办?最简单的方法是按照Google SDK文档上的说明进行操作。第一 从Google API项目下载您的凭据。将文件命名为credentials.json。然后运行代码:

using (var stream =
    new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
{
    // The file token.json stores the user's access and refresh tokens, and is created
    // automatically when the authorization flow completes for the first time.
    string credPath = "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        Scopes,
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
    Console.WriteLine("Credential file saved to: " + credPath);
}

这应该创建一个文件夹token.json,而内部文件夹是另一个具有您的 刷新令牌。

{
    "access_token" : "asdf",
    "token_type" : "Bearer",
    "expires_in" : 3600,
    "refresh_token" : "XXX",
    "scope" : "https://www.googleapis.com/auth/admin.directory.user.readonly",
    "Issued" : "2019-02-08T12:37:06.157-08:00",
    "IssuedUtc" : "2019-02-08T20:37:06.157Z"
}

我不想使用GoogleWebAuthorizationBroker,因为它会在以下情况下自动启动网络浏览器: 找不到令牌。我更喜欢通过访问代码获取刷新令牌的传统方法。 这与使用Google OAuthUtil.CreateOAuth2AuthorizationUrlOAuthUtil.GetAccessToken非常相似 在Google的旧版OAuth API中。

var a = new Google.Apis.Auth.OAuth2.Flows.GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "asdf",
        ClientSecret = "hij"
    },
    Scopes = Scopes
};
var flow = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(a);
var url = flow.CreateAuthorizationCodeRequest(GoogleAuthConsts.InstalledAppRedirectUri).Build().AbsoluteUri;
Console.WriteLine("Go to this URL and get access code: " + url);

Console.Write("Enter access code: ");
var code = Console.ReadLine();

Console.WriteLine("Fetching token for code: _" + code + "_");
var r = flow.ExchangeCodeForTokenAsync("user", code, GoogleAuthConsts.InstalledAppRedirectUri, CancellationToken.None).Result;
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(r));