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
필요한 정보를 입력하세요:
- 회사 이름
- 애플리케이션 이름
- 애플리케이션 웹사이트
- 인증 콜백 URL
- 프로덕션 환경:
https://example.com/api/auth/callback/azure-devops
- 개발 환경:
https://localhost/api/auth/callback/azure-devops
- 프로덕션 환경:
- 허용된 범위
- 최소 요구사항:
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
}