2015-01-25 14 views
0

OAuth2, GitHub를 사용하여 사용자를 인증하고이를 위해 여권을 사용하려고합니다.여권 및 몽구스 모델을 사용하여 사용자를 찾거나 만듭니다.

전적으로 테스트 목적으로 매우 간단한 사용자 모델을 사용합니다.

var mongoose = require("mongoose"), 
    Schema = mongoose.Schema; 
UserSchema = new Schema({ 
    email: { type: String, unique: true } 
}); 
mongoose.model("User", UserSchema); 

경로는 여권의 문서에서 다소 벗어나 있습니다.

router.get("/github", passport.authenticate("GitHub", { scope: ["user"] })); 
router.get("/github/callback", passport.authenticate("GitHub", { 
    successRedirect: "/#/user/authenticated", 
    failureRedirect: "/#/auth/error" 
})); 

serializeUser 및 deserializeUser 후, 나는 다음과 같은 한 :

passport.use('GitHub', new OAuth2Strategy({ 
    authorizationURL: 'https://github.com/login/oauth/authorize', 
    tokenURL: 'https://github.com/login/oauth/access_token', 
    clientID: 'client id', 
    clientSecret: 'too secret for you to handle', 
    callbackURL: 'http://dev.corvid.com:3000/auth/github/callback' 
    }, function(accessToken, refreshToken, profile, done) { 
    User.findOneAndUpdate(
     { _id: profile.id },     // what to query for 
     { $set: { email: profile.email } }, // the update arguments 
     { new: true, upsert: true},   // the options 
    function(err, user) { 
     done(err, user); 
    }); 
    } 
)); 

그러나, 나는 꽤 의도 한대로이 작업을 얻을 수없는 것. 그것은 나를 받아들이는 github에서 인증하도록 지시합니다. 그런 다음 다음과 같은 메시지가 뜹니다 내 사이트로 다시 리디렉션 오전 :

{"message":"Cast to string failed for value \"undefined\" at path \"email\""} 

빠른 CONSOLE.LOG는 프로파일이 빈 개체 {} 것을 보여준다.

단일 페이지 앱에서 여권으로 OAuth2 사용자를 인증하고 인증하는 방법은 어떻게 관리해야합니까?

편집 : 마지막 페이지의 URL은 다음과 같습니다

답변

0

http://dev.corvid.com:3000/auth/github/callback?code=xxxx

var passport  = require("passport"); 
var GitHubStrategy = require("passport-github").Strategy; 
var mongoose  = require("mongoose"); 
var User   = mongoose.model("User"); 

passport.serializeUser(function(user, done) { 
    var query = { githubId: user.id }; 
    var update = { $set: { 
    githubId: user.id, 
    name: user.displayName, 
    avatarUrl: user._json.avatar_url, 
    profile: user._json 
    }}; 
    var options = { new: true, upsert: true }; 
    User.findOneAndUpdate(query, update, options, function(err, u) { 
    return done(err, u); 
    }); 
}); 

passport.deserializeUser(function(id, done) { 
    User.find({ "githubId": id }, function(err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new GitHubStrategy({ 
    clientID: 'identification', 
    clientSecret: 'too secret to handle', 
    callbackURL: 'http://dev.corvid.me:3000/auth/github/callback' 
    }, function(accessToken, refreshToken, profile, done) { 
    process.nextTick(function() { 
     return done(null, profile); 
    }); 
    } 
)); 
작업 듯