Skip to content
Migrating from NextAuth.js v4? Read our migration guide.

Azure DevOps Provider

⚠️

더 이상 사용되지 않음 - 여전히 사용 가능하지만, Microsoft는 더 이상 지원하지 않습니다. Azure DevOps OAuth를 사용하지 말고 Microsoft Entra ID를 대신 사용할 것을 권장합니다.

리소스

설정

콜백 URL

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

환경 변수

.env.local 파일에 다음 항목을 추가하세요:

AZURE_DEVOPS_APP_ID=<여기에 App ID 값을 복사하세요>
AZURE_DEVOPS_CLIENT_SECRET=<여기에 생성된 클라이언트 시크릿 값을 복사하세요>

애플리케이션 등록

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

필요한 정보를 입력하세요:

  1. 회사 이름
  2. 애플리케이션 이름
  3. 애플리케이션 웹사이트
  4. 인증 콜백 URL
    • 프로덕션 환경: https://example.com/api/auth/callback/azure-devops
    • 개발 환경: https://localhost/api/auth/callback/azure-devops
  5. 허용된 범위
    • 최소 요구사항: User profile (read)

‘애플리케이션 생성’을 클릭하세요.

⚠️
  • 로컬호스트에서도 HTTPS를 사용해야 합니다.

  • 나중에 범위를 변경하려면 애플리케이션을 삭제하고 새로 생성해야 합니다.

다음 단계에서 필요한 데이터는 다음과 같습니다:

  • App ID
  • Client Secret (‘보기’ 버튼을 클릭한 후, 상단의 App Secret 항목은 무시하세요)
  • 허용된 범위

설정

/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 }) {
      // 토큰은 절대 만료 시간을 가짐
      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",
      }),
    }
  )
 
  // 새로 고쳐진 토큰은 상대 만료 시간을 가짐
  const accessTokenExpires = Date.now() + newToken.expires_in * 1000
}
Auth.js © Balázs Orbán and Team - 2025