2014-03-18 6 views
8

Ich versuche, Refresh-Token für Google-Konto mit Microsoft.Owin.Security.Google im MVC5-Projekt zu erhalten. Um RefreshToken in Resposne vom Google Server zu erhalten, muss ich access_type = offline setzen. Aber ich kann keine geeignete Eigenschaft in GoogleOAuth2AuthenticationOptions Objekt dafür finden.GoogleOAuth2AuthenticationOptions Einstellung access_type als offline

-Code-Authentifizierung

 var gao = new GoogleOAuth2AuthenticationOptions 
     { 
      ClientId = ConfigurationManager.AppSettings.Get("GoogleClientId"), 
      ClientSecret = ConfigurationManager.AppSettings.Get("GoogleClientSecret"), 
      Provider = new GoogleOAuth2AuthenticationProvider 
      { 
       OnAuthenticated = async ctx => 
       { 
        var refreshToken = ctx.RefreshToken; 
        //ctx.Identity.AddClaim(new Claim("refresh_token", refreshToken));      
       } 
      } 
     }; 

     gao.Scope.Add(TasksService.Scope.Tasks); 
     gao.Scope.Add("openid"); 

     app.UseGoogleAuthentication(gao); 

Antwort

3

Veröffentlichung 3.0.0 der Microsoft.Owin.Security Bibliothek wird diese Option zum GoogleOAuth2AuthenticationProvider das Hinzufügen (siehe behoben issue #227). Nach Katana Project roadmap wird es im Spätsommer 2014 verfügbar sein. Wenn Sie diese Fähigkeit vor der offiziellen Veröffentlichung benötigen, können Sie den letzten Build über den Pre-Release-NuGet-Kanal erhalten.

Sie können es dann so konfigurieren, wie so (in Startup.Auth.cs):

app.UseGoogleAuthentication(new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationOptions { 
    ClientId = ..., 
    ClientSecret = ..., 
    AccessType = "offline", 
    Provider = new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationProvider { 
     OnAuthenticated = context => { 
      if (!String.IsNullOrEmpty(context.RefreshToken)) { 
       context.Identity.AddClaim(new Claim("RefreshToken", context.RefreshToken)); 
      } 
      return Task.FromResult<object>(null); 
     } 
    }); 

Und Sie können den Aktualisierungs-Token in ExternalLoginCallback (AccountController.cs, wenn Sie den Standardcode Organisation gehalten) erhalten:

string refreshToken = loginInfo.ExternalIdentity.Claims 
    .Where(i => i.Type == "RefreshToken") 
    .Select(i => i.Value) 
    .SingleOrDefault(); 
+0

Für diejenigen, die darüber stolpern. Sie müssen die App widerrufen und erneut zum Zustimmungsbildschirm gehen, um dieses Aktualisierungstoken zu erhalten. –

3

Es gibt keine Möglichkeit, diese von Microsoft.Owin.Security.Google Montage zu ermöglichen, unter Verwendung von in der aktuellen Version zu tun. Aber aufgrund der Tatsache, dass diese Bibliothek Open Source ist, können Sie sie so ändern, dass sie ein Refresh-Token erhalten.

Wie bereits erwähnt, muss google oauth2.0 die Eigenschaft access_type auf offline eingestellt haben. Sie können dies erreichen, indem Sie eine statische Zeile hinzufügen (damit diese Eigenschaft jedes Mal gesetzt wird - nicht die beste Lösung, aber so schnell, wie sie einmal funktioniert) in GoogleOAuth2AuthenticationHandler Methode ApplyResponseChallengeAsync() als Hinzufügen der Abfragezeichenfolge AddQueryString(queryStrings, properties, "access_type", "offline").

1

Eigentlich ist ein Weg, dies zu tun! Ich habe etwas Ähnliches mit dem Querystring-Element "login_hint" gemacht.

Wenn Sie den Anbieter erklären können Sie einen OnApplyRedirect Handler registrieren und die URL dort ändern:

this.Provider = new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationProvider 
     { 
      OnApplyRedirect = async context => 
       { 
        string redirect = context.RedirectUri; 

        // Change the value of "redirect" here 
        // e.g. append access_type=offline 

        context.Response.Redirect(redirect); 
       }, 
      OnAuthenticated = async context => 
      { 
       // Do stuff 
      } 
     }; 
+1

Obwohl, darüber nachzudenken, sollten Sie wahrscheinlich ein Dienstkonto verwenden, wenn Sie Offline-Zugriff benötigen .. –

+0

Dies hat bei mir funktioniert. In welchen Szenarien sollten Sie dies im Vergleich zu einem Dienstkonto tun? Ich benötige einen Zugriff und ein Aktualisierungstoken, damit ich jeden Tag offline auf die Google Analytics-Konten von Nutzern zugreifen kann, um ihre Daten zu verarbeiten, und ich benutze OAuth, damit sie mir die Erlaubnis erteilen. Vielen Dank! – TWilly

Verwandte Themen