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
提供所需详细信息
- 公司名称
- 应用程序名称
- 应用程序网站
- 授权回调 URL
https://example.com/api/auth/callback/azure-devops
用于生产https://127.0.0.1/api/auth/callback/azure-devops
用于开发
- 授权范围
- 所需最小值是
用户个人资料 (读)
- 所需最小值是
单击“创建应用程序”。
⚠️
-
即使对于 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
}