跳至内容
从 NextAuth.js v4 迁移?阅读 我们的迁移指南.

providers/azure-devops

AzureDevOpsProfile

参见

Azure DevOps Services REST API 7.0 · Profiles · Get

扩展

属性

coreAttributes

coreAttributes: {
  Avatar: {
     value: {
        value: string;
     };
  };
};
头像
Avatar: {
  value: {
     value: string;
  };
};
Avatar.value
value: {
  value: string;
};
Avatar.value.value
value: string;

displayName

displayName: string;

emailAddress

emailAddress: string;

id

id: string;

default()

default<P>(options): OAuthConfig<P>

类型参数

类型参数
P extends AzureDevOpsProfile

参数

参数类型
optionsOAuthUserConfig<P> & { scope: string; }

返回值

OAuthConfig<P>

已弃用

尽管仍然可用,但微软 不再支持 Azure DevOps OAuth,建议使用 Microsoft Entra ID

文档

Microsoft 文档 · Azure DevOps · 使用 OAuth 2.0 授权访问 REST API

配置

注册应用程序

提供必要的信息

  • 公司名称
  • 应用程序名称
  • 应用程序网站
  • 授权回调 URL
    • https://example.com/api/auth/callback/azure-devops 用于生产环境
    • https://127.0.0.1/api/auth/callback/azure-devops 用于开发环境
  • 授权范围
    • 所需最小值为 User profile (read)

单击“创建应用程序”

⚠️

即使是 localhost 也需要使用 HTTPS

⚠️

您需要删除并创建一个新的应用程序才能更改范围

以下数据与下一步相关

  • 应用程序 ID
  • 客户端密钥(单击“显示”按钮后,忽略上面的“应用程序密钥”条目)
  • 授权范围

设置环境变量

.env.local 中创建以下条目

AZURE_DEVOPS_APP_ID=<copy App ID value here>
AZURE_DEVOPS_CLIENT_SECRET=<copy generated client secret value here>
AZURE_DEVOPS_SCOPE=<copy space separated Authorized Scopes list here>

示例

import AzureDevOps from "@auth/core/providers/azure-devops"
...
providers: [
  AzureDevOps({
    clientId: process.env.AZURE_DEVOPS_APP_ID,
    clientSecret: process.env.AZURE_DEVOPS_CLIENT_SECRET,
    scope: process.env.AZURE_DEVOPS_SCOPE,
  }),
]
...

刷新令牌轮换

主要指南 为起点,并考虑以下事项

async jwt({ token, user, account }) {
  ...
  // The token has an absolute expiration time
  const accessTokenExpires = account.expires_at * 1000
  ...
}
 
async function refreshAccessToken(token) {
  ...
  const response = await fetch(
    "https://app.vssps.visualstudio.com/oauth2/token",
    {
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      method: "POST",
      body: new URLSearchParams({
        client_assertion_type:
          "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
        client_assertion: process.env.AZURE_DEVOPS_CLIENT_SECRET,
        grant_type: "refresh_token",
        assertion: token.refreshToken,
        redirect_uri:
          process.env.NEXTAUTH_URL + "/api/auth/callback/azure-devops",
      }),
    }
  )
  ...
  // The refreshed token comes with a relative expiration time
  const accessTokenExpires = Date.now() + newToken.expires_in * 1000
  ...
}
Auth.js © Balázs Orbán 和团队 -2024