Pergunta

Estive olhando o Oauth .Net Google Apis para autenticar via OAuth e usar o Google Drive Apis.

Especificamente, quero usar um token de atualização que já armazenei para instanciar um serviço GoogleDrive.

Eu encontrei amostras comohttps://code.google.com/p/google-api-dotnet-client/source/browse/Tasks.SimpleOAuth2/Program.cs?repo=samples

Parece usar "GoogleWebAuthorizationBroker.AuthorizeAsync", mas não tenho certeza de como posso usar esse método com um token de atualização em vez dos segredos do cliente que você parece estar alimentando neste exemplo.

Foi útil?

Solução

Se bem entendi, você está perguntando como criar um novo serviço do Google, com base em um token de atualização existente.

Então, você pode fazer o seguinte:

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);

Depois você pode passar suas credenciais para o inicializador do serviço.

Fazendo o acima, GoogleAutorizaçãoCodeFlow receberá um novo token de acesso com base no token de atualização e nos segredos do cliente.

Observe que você deve ter segredos do cliente aqui, sem isso você não conseguirá obter um token de acesso.

Outras dicas

O cliente client_secrets.json contém o ID do cliente e o segredo do cliente (que tem suas informações do OAuth 2.0 para sua inscrição).

Eu acho que este artigo irá explicar melhor como você pode OAuth 2.0 para acessar as APIs do Google Apps, especialmente se você estiver construindo um aplicativo da Web.

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

Se você estiver interessado em um exemplo de codificação, há um em stackoverflow: Google+ API: Como posso usar refreshtokens para evitar solicitar acesso toda vez que o meu aplicativo é iniciado?

GoogleWebAuthorizationBroker exige que você envie uma implicação de iDataStore, neste caso, FileDatastore é enviado.FileDataStore armazena os dados em% appData%.Se você quiser usar um refreshtoken salvo em outro lugar, precisará criar sua própria limitação do iDataStore.

O código para o armazenamento de dados real demora um pouco para postar aqui. http://daimto.com/google-oauth2-csharp/

Você então o usa como faria com o 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;
     }

Há um projeto de amostra anexado a esse tutorial.

Para usar o token de atualização:

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 = "",
});

E se você não tiver um token de atualização?O mais fácil é seguir as instruções nos documentos do Google SDK.Primeiro baixe suas credenciais do projeto da API do Google.Nomeie o arquivo credentials.json.Em seguida, execute o código:

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);
}

Isso deve criar uma pasta token.json e a pasta interna é outro arquivo JSON que possui o seu refresh_token.

{
    "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"
}

Prefiro não usar o GoogleWebauthorizationBroker, porque ele lança um navegador da Web quando o token não é encontrado.Eu prefiro a maneira tradicional de obter o token de atualização por código de acesso.Isso é muito semelhante ao uso do Google OAuthUtil.CreateOAuth2AuthorizationUrl e OAuthUtil.GetAccessTokenna API OAuth legada do Google.

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));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top