Pregunta

He estado buscando en el Oauth .Net Api de Google con el fin de autenticar a través de OAuth y el uso de la Api de Google drive.

Específicamente, quiero usar un token de actualización ya tengo almacenados con el fin de utilizarlo para crear una instancia de un GoogleDrive servicio.

He encontrado muestras como https://code.google.com/p/google-api-dotnet-client/source/browse/Tasks.SimpleOAuth2/Program.cs?repo=samples

Que parecen utilizar "GoogleWebAuthorizationBroker.AuthorizeAsync" pero no estoy seguro de cómo puedo utilizar ese método con un token de actualización en lugar de que el cliente secretos que parecen ser la alimentación en este ejemplo.

¿Fue útil?

Solución

Si le entiendo correctamente, está preguntando cómo puede crear un nuevo servicio de Google, según un token de actualización existente.

Entonces, puedes hacer lo siguiente:

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

Luego, puede pasar sus credenciales al inicializador del servicio.

Al hacer lo anterior, GoogleAuthorizationCodeFlow obtendrá un nuevo token de acceso según la actualización de los Secretos del Token y el cliente.

Tenga en cuenta que debe tener secretos de cliente aquí, sin eso, no podrá obtener un token de acceso.

Otros consejos

El cliente_secrets.json contiene el ID de cliente y el secreto del cliente (que tiene su información de OAUTH 2.0 para su aplicación).

Creo que este artículo explicará mejor cómo puede OAUTH 2.0 para acceder a las API de las aplicaciones de Google, especialmente si está construyendo una aplicación web.

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

Si está interesado en un ejemplo de codificación, hay uno en StackOverFlow: API de Google+: ¿Cómo puedo usar actualización para evitar solicitar acceso cada vez que se lanza mi aplicación?

GooglewebauthorizationBroker requiere que lo envíe una improducción de Idatastore en este caso se envía FiledAtAstore.FiledAtAstore almacena los datos en% AppData%.Si desea utilizar una actualización, guardó en algún lugar de otra manera, debe crear su propia imprimación de Idatastore.

El código para el DataStore real, un poco largo para publicar aquí. http://daimto.com/google-oauth2-csharp/

Luego lo usas como lo haría el FiledAtAdore

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

Hay un proyecto de muestra adjunto a ese tutorial.

Para utilizar la actualización token:

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

¿Qué pasa si usted no tiene un token de actualización?La forma más fácil es seguir las instrucciones en el SDK de Google docs.Primero descarga tus credenciales de Google API proyecto.Nombre del archivo credentials.json.A continuación, ejecute el 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);
}

Esto debería crear una carpeta token.json y dentro de la carpeta es otro archivo json que tiene su 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"
}

Prefiero no utilizar el GoogleWebAuthorizationBroker porque se auto inicia un navegador web cuando el token no se encuentra.Yo prefiero la vieja escuela manera de obtener el token de actualización por código de acceso.Esto es muy similar a la de usar el Google OAuthUtil.CreateOAuth2AuthorizationUrl y OAuthUtil.GetAccessToken en Google legado del API OAuth.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top