尝试使用离子应用程序登录到Azure AD时出现CORS问题

时间:2018-10-11 15:55:19

标签: javascript azure oauth active-directory

我正在与Node,Express和Ionic一起创建一个Azure AD身份验证系统。 我正在使用passportjspassport-azure-ad

当我尝试使用后端登录时,一切正常,但是从前端调用时,我会得到:

  

无法加载   https://login.microsoftonline.com/ ...:   对预检请求的响应未通过访问控制检查:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。因此,不允许访问原始“空”。

我遵循了此tutorial,将passport设置为

这是后面的路线:

router.get('/auth/openid/return', passport.authenticate('azuread-openidconnect'), function(req, res, next) {

    res.send(req.user);
});

router.get('/login', passport.authenticate('azuread-openidconnect'));

这是passport的设置:

passport.serializeUser((user, done) => {
    // user et le resultat que tu as mis dans les autres done en dessous
    done(null, user.id)
});

passport.deserializeUser((id, done) => {
    dbConsumer.findByPrimaryId(id).then(user => {
        done(null, user)
    });
});

passport.use(new OIDCStrategy({
    // TODO ne pas commiter ces infooooooos
    clientID: "correct clientId",
    clientSecret: "correct client secret",
    identityMetadata: "https://login.microsoftonline.com/constellationdemo.onmicrosoft.com/v2.0/.well-known/openid-configuration",
    responseType: "code",
    responseMode: "query",
    redirectUrl: "https://localhost:3000/azure/auth/openid/return",
    passReqToCallback: false
},
    function(accessToken, refreshToken, profile, done) {
        // look for the user
        dbConsumer.findByAzureId(profile.oid).then(user => {
           if(user.rowCount > 0){
               logger.log({
                   level: 'info',
                   message: profile.displayName + "already exists"
               });
               // On passe un user pour qu'il reconnaisse le user dans le serializer au dessus
               done(null, user.rows[0]);
           }
           else {
               dbConsumer.insertUserProvider(profile.displayName, profile.oid).then(data => {
                   if(data.success) {
                       logger.log({
                           level: 'info',
                           message: "User: " + profile.displayName + "inserted"
                       });
                       // On passe un user pour qu'il reconnaisse le user dans le serializer au dessus
                       done(null, data.newUser);
                   }
               }).catch(err => {
                   logger.log({
                       level: 'error',
                       message: err
                   });
               });
           }
        }).catch(err => {
            console.log("dans l err");
            console.log(err);
        });
}))

这是我的前台服务:

initHeaders() {
    let headers = new HttpHeaders()
      .set('Access-Control-Allow-Origin', "*")
      .set("Content-Type", "application/json")
      .set("Access-Control-Expose-Headers", "Content-Length");

    return headers;
  }

  logToAzure() {
    return this.http.get(this.domain + 'azure/login', {headers: this.initHeaders()})
  }

当我在控制台中检查请求时,未设置任何标头。

我还在背面启用了cors;

我需要帮助

1 个答案:

答案 0 :(得分:0)

我在使用一些带角度的api时遇到相同的问题。如果您使用Chrome,请尝试使用此Chrome应用 Allow-Control-Allow-Origin

Reference image enable cors with Allow-Control-Allow-Origin

启用cors后,某些api不会响应(登录服务,youtube视频流和google驱动器无法正常工作,因此请谨慎操作)