2014-05-04 2 views
3

J'essaie d'obtenir l'authentification google plus pour une application web, mais je reçois continuellement des erreurs redirect_uri_mismatch. J'ai vérifié et re-vérifié que j'ai des urls de redirection correspondant dans le code et dans les paramètres de google.google api erreur redirect_uri_mismatch

J'ai signalé l'emplacement que les choses de rupture à -> ICI ** LES ACCIDENTS DE

Toute aide serait appréciée.

js liaison

window.gplusSigninCallback = function(authResult) { 
    if (!authResult.code) { 
    return; 
    } 

    request 
    .post('/api/users') 
    .send({ code: authResult.code }) 
    .end(function(err, res) { 
     dom('#signinButton').remove(); 
    }); 
}; 

Google + composant

<span id="signinButton"> 
    <span class="g-signin" 
    data-scope="https://www.googleapis.com/auth/plus.login" 
    data-clientid="{clientId}" 
    data-redirecturi="postmessage" 
    data-accesstype="offline" 
    data-cookiepolicy="single_host_origin" 
    data-callback="gplusSigninCallback"> 
    </span> 
</span> 

POST/utilisateurs

de code utilisé https://github.com/google/google-api-nodejs-client/blob/master/examples/oauth2.js

'use strict'; 

const router = require('express').Router(); 
const User  = require('../models/user'); 

const GoogleCreds = require('../config/google_api_credentials').web; 
const googleapis = require('googleapis'); 
const OAuth2Client = googleapis.OAuth2Client; 

module.exports = router; 

/** 
* 
*/ 
router.post('/', function(req, res) { 
    /* jshint camelcase:false */ 

    const clientId  = GoogleCreds.client_id; 
    const clientSecret = GoogleCreds.client_secret; 
    const redirectUrl = 'http://localhost:3000'; 
    const oneTimeCode = req.body.code; 

    try { 
    authenticate(); 
    } catch (ex) { 
    console.log(ex.message); 
    } 

    function authenticate() { 
    googleapis 
     .discover('plus', 'v1') 
     .execute(function(err, client) { 
     let oauth2Client = new OAuth2Client(clientId, clientSecret, redirectUrl); 

     getAccessToken(oauth2Client, function() { 
      getUserProfile(client, oauth2Client, 'me', function(err, profile) { 
      if (err) { 
       throw new Error(err); 
      } 

      let userAttrs = { 
       foo: 'bar' 
      }; 

      User.findOrCreate(userAttrs, function(err, user) { 
       res.set('X-API-TOKEN', user.apiToken); 
       res.send(user); 
      }); 
      }); 
     }); 
     }); 
    } 

    function getUserProfile(client, authClient, userId, callback) { 
    client 
     .plus.people.get({ userId: userId }) 
     .withAuthClient(authClient) 
     .execute(callback); 
    } 

    function getAccessToken(oauth2Client, callback) { 
    oauth2Client.generateAuthUrl({ 
     access_type: 'offline', // will return a refresh token 
     scope: 'https://www.googleapis.com/auth/plus.login' 
    }); 

    oauth2Client.getToken(oneTimeCode, function(err, tokens) { 
     if (err) { 
     // ** CRASHES HERE 
     throw new Error(err); 
     } 
     oauth2Client.setCredentials(tokens); 
     callback(); 
    }); 
    } 
}); 
+0

Ceux-ci semblent être de bonnes solutions possibles: http://stackoverflow.com/questions/13221978/getting-error-redirect-uri-mismatch-the-redirect-uri-in-the-request- http-loc – user3590396

Répondre

4

La raison du problème était que le répertoire redirectUrl du côté serveur doit également être défini sur postmessage.

+0

La chose "drôle" est que si vous utilisez l'API js pour obtenir le jeton temporaire (pas le bouton de connexion, juste gapi.auth.signIn), alors la configuration de la redirection côté client uri est complètement cachée. Donc, je viens de passer environ 4 heures à essayer de comprendre pourquoi j'ai continué à obtenir l'erreur redirect_uri_mismatch. Un grand merci à vous. – Kicsi

Questions connexes