跳至内容
从 NextAuth.js v4 迁移?阅读 我们的迁移指南.
入门提供程序Azure Devops

Azure DevOps 提供程序

⚠️

已弃用 - 虽然仍然可用,但 Microsoft 正在 不再支持 Azure DevOps OAuth,并建议使用 Microsoft Entra ID 来代替。

资源

安装

回调 URL

https://example.com/api/auth/callback/azure-devops

环境变量

.env.local 中创建以下条目

AZURE_DEVOPS_APP_ID=<copy App ID value here>
AZURE_DEVOPS_CLIENT_SECRET=<copy generated client secret value here>

注册应用程序

https://app.vsaex.visualstudio.com/app/register

提供所需详细信息

  1. 公司名称
  2. 应用程序名称
  3. 应用程序网站
  4. 授权回调 URL
    • https://example.com/api/auth/callback/azure-devops 用于生产
    • https://127.0.0.1/api/auth/callback/azure-devops 用于开发
  5. 授权范围
    • 所需最小值是 用户个人资料 (读)

单击“创建应用程序”。

⚠️
  • 即使对于 localhost,也需要使用 HTTPS。

  • 您将必须删除并创建一个新应用程序才能稍后更改范围。

以下数据与下一步相关

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

配置

/auth.ts
import NextAuth from "next-auth"
import AzureDevOps from "next-auth/providers/azure-devops"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  providers: [
    AzureDevOps({
      clientId: AUTH_AZURE_DEVOPS_APP_ID,
      clientSecret: AUTH_AZURE_DEVOPS_CLIENT_SECRET,
    }),
  ],
})

刷新令牌轮换

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

./auth.ts
export const { signIn, signOut, auth } = NextAuth({
  callbacks: {
    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: 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