與第三方後端整合
當透過提供者登入時,您可以使用接收到的 OAuth Token 來驗證第三方 API。這些 Token 可用於授權對支援相應提供者的後端的請求。
例如
- GitHub 的
access_token
將讓您存取 GitHub 的 API。 - 自我管理的提供者(例如 Keycloak、
oidc-provider
等)可用於針對自訂第三方後端進行授權。
將 Token 儲存在 Session 中
Token 會在 jwt 回調的 account
參數中提供。為了將它們儲存在 Session 中,可以先將它們附加到 Token。
jwt({ token, trigger, session, account }) {
if (account?.provider === "my-provider") {
return { ...token, accessToken: account.access_token }
}
// ...
}
為了在發出 API 請求時存取 Token,需要讓 Auth.js Session 可用。
async session({ session, token }) {
session.accessToken = token.accessToken
return session
}
使用 Token 發出授權 API 請求
OAuth Token 通常會附加為 Authorization: Bearer <>
標頭。建議在伺服器端附加此標頭,例如 Route Handler。
export async function handler(request: NextRequest) {
const session = await auth()
return await fetch(/*<your-backend-url>/api/authenticated/greeting*/, {
headers: { "Authorization": `Bearer ${session?.accessToken}` }
})
// ...
}
設定後端以透過您的提供者授權請求
請參閱您的後端框架的文件,了解如何驗證傳入的存取 Token。以下是一個使用 Express.js 和 Keycloak 實例的範例。
const app = express()
const jwtCheck = jwt({
secret: jwks.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri:
"https://keycloak.authjs.dev/realms/master/protocol/openid-connect/certs",
}),
issuer: "https://keycloak.authjs.dev/realms/master",
algorithms: ["RS256"],
})
app.get("*", jwtCheck, (req, res) => {
const name = req.auth?.name ?? "unknown name"
res.json({ greeting: `Hello, ${name}!` })
})
// ...
資源
- 其他後端框架的更多範例可以在這裡找到。
- 如何在客戶端應用程式中整合第三方 API 的完整範例可以在 next-auth-example 中找到。
- Keycloak - 適用於現代應用程式和服務的開源身分和存取管理
oidc-provider
- Node.js 的 OpenID Certified™ OAuth 2.0 授權伺服器實作