使用 Passport 和 passport-azure-ad 时没有刷新令牌

Posted

技术标签:

【中文标题】使用 Passport 和 passport-azure-ad 时没有刷新令牌【英文标题】:No refresh token when using Passport and passport-azure-ad 【发布时间】:2017-11-19 09:12:21 【问题描述】:

我正在尝试使用 Passport 连接到 Office365。我得到了身份验证提示并返回了访问令牌。问题是刷新令牌未定义。

我的设置

// In app.js
const creds = 
    redirectUrl: 'http://localhost:3000/token',
    clientID: '<myClientId>',
    clientSecret: '<mySecret>',
    identityMetadata: 'https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration',
    allowHttpForRedirectUrl: true, // For development only
    accessType: 'offline',
    responseType: 'code',
    validateIssuer: false, // For development only
    responseMode: 'query',
    scope: [
        'Contacts.Read',
        ...
    ]
;

const callback = (iss, sub, profile, accessToken, refreshToken, done) => 
  console.log('Refresh Token: ', refreshToken); // this is undefined
  done(null, 
    profile,
    accessToken,
    refreshToken
  );
;

passport.use(new OIDCStrategy(creds, callback));

// When I authenticate
const passportSettings = 
  accessType: 'offline',
  approvalPrompt: 'consent'
;

// Authentication request.
router.get('/login', (req, res, next) => 
  passport.authenticate('azuread-openidconnect', passportSettings, (err, user, info) => 
        // Do stuff.
  );
);

我尝试过的事情:

为我注册的用户取消对应用的授权。 移动accessType 设置的位置。

我真的不知道为什么这不起作用。使用 Google 策略,只需设置“离线”类型似乎就足够了。

【问题讨论】:

【参考方案1】:

您似乎需要将offline_access 范围添加到应用注册以及配置中。见https://github.com/AzureAD/passport-azure-ad/issues/322。

【讨论】:

以上是关于使用 Passport 和 passport-azure-ad 时没有刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

Passport 序列化和反序列化与 JWT

如何同时使用 Bearer 和 oauth2 passport.js 策略?

使用 Passport 和 ExpressJS 进行 Facebook 身份验证 - 为啥不调用验证回调?

使用 Passport.js 验证角色和身份验证

使用 Passport 和 Laravel 进行身份验证时返回访问令牌和用户

使用 Passport.js 和 Sails.js 注册后如何重定向到特定位置?