2
0
Эх сурвалжийг харах

login with err "Can't set headers after they are sent"

sou 7 жил өмнө
parent
commit
6fe4606fa9

+ 3 - 3
lib/routes/index.js

@@ -69,11 +69,11 @@ module.exports = function(crowi, app) {
 
   // OAuth
   app.post('/_api/admin/security/passport-google' , loginRequired(crowi, app) , middleware.adminRequired() , csrf, form.admin.securityPassportGoogle, admin.api.securityPassportGoogleSetting);
+  app.post('/_api/admin/security/passport-github' , loginRequired(crowi, app) , middleware.adminRequired() , csrf, form.admin.securityPassportGitHub, admin.api.securityPassportGitHubSetting);
   app.get('/passport/google'                      , loginPassport.loginPassportGoogle);
+  app.get('/passport/github'                      , loginPassport.loginPassportGitHub);
   app.get('/passport/google/callback'             , loginPassport.loginPassportGoogleCallback);
-  app.post('/_api/admin/security/passport-github' , loginRequired(crowi, app) , middleware.adminRequired() , csrf, form.admin.securityPassportGitHub, admin.api.securityPassportGitHubSetting);
-  // app.get('/passport/github'                      , loginPassport.loginPassportGoogle);
-  // app.get('/passport/github/callback'             , loginPassport.loginPassportGoogleCallback);
+  app.get('/passport/github/callback'             , loginPassport.loginPassportGitHubCallback);
 
   // markdown admin
   app.get('/admin/markdown'                   , loginRequired(crowi, app) , middleware.adminRequired() , admin.markdown.index);

+ 37 - 1
lib/routes/login-passport.js

@@ -231,6 +231,40 @@ module.exports = function(crowi, app) {
     });
   };
 
+  const loginPassportGitHub = function(req, res) {
+    if (!passportService.isGitHubStrategySetup) {
+      debug('GitHubStrategy has not been set up');
+      return;
+    }
+
+    passport.authenticate('github')(req, res);
+  };
+
+  const loginPassportGitHubCallback = async(req, res, next) => {
+    const providerId = 'github';
+    const strategyName = 'github';
+    const response = await promisifiedPassportAuthentication(req, res, next, strategyName);
+    const userInfo = {
+      'id': response.id,
+      'username': response.username,
+      'name': response.displayName
+    }
+
+    const externalAccount = await getOrCreateUser(req, res, next, userInfo, providerId);
+    if (!externalAccount) {
+      return loginFailure(req, res, next);
+    }
+
+    const user = await externalAccount.getPopulatedUser();
+
+    // login
+    await req.logIn(user, err => {
+      if (err) { return next(err) };
+      return loginSuccess(req, res, user);
+    });
+    return next()
+  };
+
   const promisifiedPassportAuthentication = (req, res, next, strategyName) => {
     return new Promise((resolve, reject) => {
       passport.authenticate(strategyName, (err, response, info) => {
@@ -279,7 +313,7 @@ module.exports = function(crowi, app) {
           return loginFailure(req, res, next);
         }
       }
-      throw err;  // throw again
+      // throw err;  // throw again
     }
   }
 
@@ -289,6 +323,8 @@ module.exports = function(crowi, app) {
     testLdapCredentials,
     loginWithLocal,
     loginPassportGoogle,
+    loginPassportGitHub,
     loginPassportGoogleCallback,
+    loginPassportGitHubCallback,
   };
 };

+ 9 - 9
lib/views/login.html

@@ -145,22 +145,22 @@
         </div>
         {% endif %}
 
-        {% if passportGoogleLoginEnabled() || passportGithubLoginEnabled() || passportFacebookLoginEnabled() || passportTwitterLoginEnabled() %}
+        {% if passportGoogleLoginEnabled() || passportGitHubLoginEnabled() || passportFacebookLoginEnabled() || passportTwitterLoginEnabled() %}
         <hr>
         <div class="input-group m-t-15 m-b-10 mx-auto d-flex flex-row justify-content-around flex-wrap">
           {% if passportGoogleLoginEnabled() %}
           <form role="form" action="/passport/google" method="get">
-            <button type="submit" class="fcbtn btn btn-danger btn-1b btn-login-google">
+            <button type="submit" class="fcbtn btn btn-1b btn-login-google">
               <span class="btn-label"><i class="icon-social-google"></i></span>
               {{ t('Sign in') }}
             </button>
             <div class="small text-right">by Google Account</div>
           </form>
           {% endif %}
-          {% if passportGithubLoginEnabled() %}
-          <form role="form" action="/auth/passport/github" method="get">
+          {% if passportGitHubLoginEnabled() %}
+          <form role="form" action="/passport/github" method="get">
             <input type="hidden" name="_csrf" value="{{ csrf() }}">
-            <button type="submit" class="fcbtn btn btn-danger btn-1b btn-login-github">
+            <button type="submit" class="fcbtn btn btn-1b btn-login-github">
               <span class="btn-label"><i class="icon-social-github"></i></span>
               {{ t('Sign in') }}
             </button>
@@ -168,9 +168,9 @@
           </form>
           {% endif %}
           {% if passportFacebookLoginEnabled() %}
-          <form role="form" action="/auth/passport/facebook" method="get">
+          <form role="form" action="/passport/facebook" method="get">
             <input type="hidden" name="_csrf" value="{{ csrf() }}">
-            <button type="submit" class="fcbtn btn btn-danger btn-1b btn-login-facebook">
+            <button type="submit" class="fcbtn btn btn-1b btn-login-facebook">
               <span class="btn-label"><i class="icon-social-facebook"></i></span>
               {{ t('Sign in') }}
             </button>
@@ -178,9 +178,9 @@
           </form>
           {% endif %}
           {% if passportTwitterLoginEnabled() %}
-          <form role="form" action="/auth/passport/twitter" method="get">
+          <form role="form" action="/passport/twitter" method="get">
             <input type="hidden" name="_csrf" value="{{ csrf() }}">
-            <button type="submit" class="fcbtn btn btn-danger btn-1b btn-login-twitter">
+            <button type="submit" class="fcbtn btn btn-1b btn-login-twitter">
               <span class="btn-label"><i class="icon-social-twitter"></i></span>
               {{ t('Sign in') }}
             </button>