获取 Microsoft 用户的电子邮件地址

问题描述 投票:0回答:2

我想向我的平均堆栈应用程序添加一个

login with Microsoft
按钮。所以我正在使用 passport-microsoft

通过使用

passport.authenticate('microsoft', { scope: ['User.Read'] })
,我可以获得以下信息:
@odata.context
givenName
surname
displayName
id
userPrincipalName
businessPhones
jobTitle
mail
mobilePhone 
officeLocation
preferredLanguage
。对我来说,我的
userPrincipalName
是电子邮件地址,而我的
mail
null

我已按如下方式设置应用程序,但如果我写

passport.authenticate('microsoft', { scope: ['User.Read', 'email'] })
,身份验证会给我一个“无效范围”错误。

有人知道如何设置我的应用程序并请求获取用户的电子邮件地址吗?

passport.js microsoft-graph-api azure-ad-graph-api microsoft-account
2个回答
1
投票

如果您查看

user
对象的文档,您会发现以下内容:

邮件

字符串

用户的 SMTP 地址,例如, “[电子邮件受保护]”。只读。支持$过滤器。

用户主体名称

字符串

用户的用户主体名称 (UPN)。 UPN 是一个 基于互联网标准的用户互联网风格登录名 RFC 822。按照惯例,这应该映射到用户的电子邮件名称。 一般格式为alias@domain,其中domain必须存在于 租户经过验证的域的集合。此属性为必填项 当创建用户时。租户的已验证域可以是 从组织的 verifyDomains 属性访问。支持 $filter 和 $orderby。

因此看来

mail
属性不一定代表用户的电子邮件地址,而是专门用于 Outlook 和 Office 365。它也不是创建用户时的必需属性。相反,您应该依赖
userPrincipalName
作为用户的电子邮件。

至于您的范围错误,您应该分享完整的错误消息。


0
投票

控制台在验证函数中记录profile对象以查看其形状和属性。用户的电子邮件应可通过 profile._json.userPrincipalName.

进行访问
//Modified example from documentation (source: https://www.passportjs.org/packages/passport-microsoft/):

    var MicrosoftStrategy = require('passport-microsoft').Strategy;
    passport.use(new MicrosoftStrategy({
        clientID: 'applicationidfrommicrosoft',
        clientSecret: 'applicationsecretfrommicrosoft',
        callbackURL: "http://localhost:3000/auth/microsoft/callback",
        scope: ['user.read'],
      },
      function(accessToken, refreshToken, profile, done) {
        console.log(profile); //  <---- Log and inspect this!
        User.findOrCreate({ userId: profile.id }, function (err, user) {
          return done(err, user);
        });
      }
    ));
© www.soinside.com 2019 - 2024. All rights reserved.