2017-05-22 9 views
0

Ich habe eine Umbraco Website, die in Schaltfläche Google Vorzeichen hat wie folgt konfiguriert:Google OAuth Ausgabe

Ganz oben auf der Seite (im Kopfteil) ich die Skripte haben für den Aufruf von Google-API:

<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script> 
<script> 
     function start() { 
      gapi.load('auth2', function() { 
      auth2 = gapi.auth2.init({ 
       client_id: '<myapp client Id>.apps.googleusercontent.com', 
       // Scopes to request in addition to 'profile' and 'email' 
       redirect_uri: 'http://localhost:40136/umbraco/Surface/AuthSurface/GoogleAuthrizedUser', 
       scope: 'profile email' 
      }); 
      }); 
     } 
</script> 

im Körper Abschnitt des Codes habe ich die Taste Setup google und die zugehörige Klickfunktion:

<script> 
function onSignIn(authResult) { 
    if (authResult['code']) { 
     var authCode = authResult['code']; 
     console.log("Authorization Code: " + authCode); 
     $.post("/umbraco/Surface/AuthSurface/GoogleAuthrizedUser", { code: authCode }) 
     .done(function(msg) { 
      // Success settings 
     }) 
     .fail(function(xhr, status, error) { 

     }); 
    } else { 
     //authResult['code'] is null 
     //handle the error message. 
    } 
    }; 
</script> 

Controller-Code, der den Rückruf auf dem Server Ende Griffe:

public class AuthSurfaceController : SurfaceController 
    { 
     public ActionResult GoogleAuthrizedUser() 
     { 
     string AuthCode = HttpContext.Request["code"]; 
     var info = new GoogleAccessTokenResponse(); 
     var client = new GoogleOAuthClient(); 
     try 
     { 
      info = client.GetAccessTokenFromAuthorizationCode(AuthCode); 
     } 
     catch (Exception ex) 
     { 
      var strMessage = String.Format("<div class=\"info\"><p>{0}</p><p>{1}</p></div>", "Google Login Error", 
      ex.Message); 
     return Json(new AjaxOperationResponse(false, strMessage)); 
     } 
    } 
} 

Auf der Serverseite benutze ich Skybrud Social Plugin für den Zugriff auf Google Apis.

Die Google-Authentifizierung geschieht im Popup und autorisiert Client mit Anmeldeinformationen und authResult ['code'] hat einen gültigen Code.

In der Steuerung, wenn ich den Client und rufen Sie die Funktion GetAccessTokenFromAuthorizationCode (AuthCode), es gibt eine Ausnahme von 'Ungültige Anforderung'

Ich versuchte Überprüfung dieses authResult [ 'Code'] in zurück initialisieren Die JavaScript-Funktion onSignIn im https://developers.google.com/oauthplayground/

Die gleiche Fehlerbeschreibung wird angezeigt "Ungültige Anfrage". Ich bin mir nicht sicher, warum das passiert. Der zurückgegebene Fehler ist "invalid_grant"

Kann jemand eine Lösung für dieses Problem haben? Was mache ich hier falsch?

Antwort

0

In Ihrem Oberflächencontroller initialisieren Sie eine neue Instanz von GoogleOAuthClient, ohne jedoch eine der Eigenschaften festzulegen. Die Methode GetAccessTokenFromAuthorizationCode erfordert, dass die Eigenschaften ClientId, ClientSecret und RedirectUri einen Wert haben. Sie können die Eigenschaften wie folgt initialisieren:

// Initialize a new instance of the OAuth client 
GoogleOAuthClient oauth = new GoogleOAuthClient { 
    ClientId = "The client ID of your project", 
    ClientSecret = "The client secret of your project", 
    RedirectUri = "The return URI (where users should be redirected after the login)" 
}; 

Sie können mehr über die Authentifizierung in der Dokumentation lesen: http://social.skybrud.dk/google/authentication/ (der Ansatz erklärt es wird jedoch kein JavaScript verwenden)

+0

@abjemer: Ich habe versucht, diesen Ansatz. Initiiere den 'GoogleOAuthClient' mit 'ClientId', 'ClientSecret' und 'RedirectUri', bevor 'GetAccessTokenFromAuthrizationCode' aufgerufen wird. –

+0

@abjemer: Ich habe diesen Ansatz versucht. Initiiere den 'GoogleOAuthClient' mit 'ClientId', 'ClientSecret' und 'RedirectUri', bevor 'GetAccessTokenFromAuthrizationCode' aufgerufen wird. Aber nimmt den asynchronen Rückruf von Javascript, die das Popup für die Authentifizierung, Autorisierung behandelt aber offline Bereich Zugriff und kommt mit authResult ['code'] zurück, wie in meiner Abfrage oben erläutert. Möchte einen Ansatz verwenden, der hier erläutert wird https://developers.google.com/identity/sign-in/web/server-side-flow. Möchten Sie Response.Redirect (authorizationUrl) nicht verwenden –

+0

@abjemer unsere Website Google Authentifizierung und Autorisierung erfolgt aus dem Menü Popup. Daher wird die reibungslose Benutzererfahrung, die asynchrones JavaScript für den Login-Workflow mit sich bringt, durch das Umleiten auf eine andere Seite verloren gehen. –