我想向我的平均堆栈应用程序添加一个
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'] })
,身份验证会给我一个“无效范围”错误。
有人知道如何设置我的应用程序并请求获取用户的电子邮件地址吗?
user
对象的文档,您会发现以下内容:
邮件
字符串
用户的 SMTP 地址,例如, “[电子邮件受保护]”。只读。支持$过滤器。
用户主体名称
字符串
用户的用户主体名称 (UPN)。 UPN 是一个 基于互联网标准的用户互联网风格登录名 RFC 822。按照惯例,这应该映射到用户的电子邮件名称。 一般格式为alias@domain,其中domain必须存在于 租户经过验证的域的集合。此属性为必填项 当创建用户时。租户的已验证域可以是 从组织的 verifyDomains 属性访问。支持 $filter 和 $orderby。
因此看来
mail
属性不一定代表用户的电子邮件地址,而是专门用于 Outlook 和 Office 365。它也不是创建用户时的必需属性。相反,您应该依赖 userPrincipalName
作为用户的电子邮件。
至于您的范围错误,您应该分享完整的错误消息。
控制台在验证函数中记录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);
});
}
));