Explorar el Código

get email and language from google

sou hace 7 años
padre
commit
eeb60ddaa3
Se han modificado 3 ficheros con 23 adiciones y 10 borrados
  1. 2 2
      lib/models/external-account.js
  2. 17 3
      lib/routes/login-passport.js
  3. 4 5
      lib/service/passport.js

+ 2 - 2
lib/models/external-account.js

@@ -68,7 +68,7 @@ class ExternalAccount {
    * @returns {Promise<ExternalAccount>}
    * @memberof ExternalAccount
    */
-  static findOrRegister(providerType, accountId, usernameToBeRegistered, nameToBeRegistered) {
+  static findOrRegister(providerType, accountId, usernameToBeRegistered, nameToBeRegistered, email, language) {
 
     return this.findOne({ providerType, accountId })
       .then(account => {
@@ -92,7 +92,7 @@ class ExternalAccount {
 
             // create a new User with STATUS_ACTIVE
             debug(`ExternalAccount '${accountId}' is not found, it is going to be registered.`);
-            return User.createUser(nameToBeRegistered, usernameToBeRegistered, undefined, undefined, undefined, User.STATUS_ACTIVE);
+            return User.createUser(nameToBeRegistered, usernameToBeRegistered, email, undefined, language, User.STATUS_ACTIVE);
           })
           .then(newUser => {
             return this.associate(providerType, accountId, newUser);

+ 17 - 3
lib/routes/login-passport.js

@@ -246,19 +246,19 @@ module.exports = function(crowi, app) {
     }
 
     passport.authenticate('google', {
-      access_type: 'offline',
       scope: ['profile', 'email'],
     })(req, res);
   };
 
   const loginPassportGoogleCallback = function(req, res, next) {
-    // enable google+ api and then this works
     passport.authenticate('google', {failureRedirect: '/login'}, (request, response) => {
       ExternalAccount.findOrRegister(
         'google',
         response.id,
         response.displayName,
-        `${response.name.givenName} ${response.name.familyName}`
+        `${response.name.givenName} ${response.name.familyName}`,
+        response.emails[0].value,
+        googleLanguageCodeConverter(response.language)
       )
       .catch((err) => {
         throw err;
@@ -280,6 +280,20 @@ module.exports = function(crowi, app) {
     })(req, res, next);
   };
 
+  /**
+   * converts google language code to growi language code
+   * add more languages as growi supports them
+   * reference: https://developers.google.com/admin-sdk/directory/v1/languages
+   * @param {*} googleLanguageCode
+   */
+  const googleLanguageCodeConverter = googleLanguageCode => {
+    let languageCode = googleLanguageCode;
+    if (googleLanguageCode !== 'ja') {
+      languageCode = 'en-US';
+    }
+    return languageCode;
+  };
+
   return {
     loginFailure,
     loginWithLdap,

+ 4 - 5
lib/service/passport.js

@@ -2,8 +2,7 @@ const debug = require('debug')('growi:service:PassportService');
 const passport = require('passport');
 const LocalStrategy = require('passport-local').Strategy;
 const LdapStrategy = require('passport-ldapauth');
-// const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
-const GoogleStrategy = require('passport-google-oauth20').Strategy;
+const GoogleStrategy = require('passport-google-auth').Strategy;
 
 /**
  * the service class of Passport
@@ -264,11 +263,11 @@ class PassportService {
     }
 
     debug('GoogleStrategy: setting up..');
-
     passport.use(new GoogleStrategy({
-      clientID: config.crowi['security:passport-google:clientId'],
+      clientId: config.crowi['security:passport-google:clientId'],
       clientSecret: config.crowi['security:passport-google:clientSecret'],
-      callbackURL: '/passport/google/callback',
+      callbackURL: 'http://localhost:3000/passport/google/callback',
+      skipUserProfile: false,
     }, function(accessToken, refreshToken, profile, done) {
       if (profile) {
         return done(null, profile);