身份验证

使用 DrupalClient 进行身份验证请求。


DrupalClient 支持多种身份验证类型。您可以使用 **Bearer** 令牌、**Basic** 令牌或提供您自己的授权头。

身份验证可以在客户端全局设置或在每个方法中自定义设置。


客户端身份验证

这是在客户端上配置的默认身份验证。

这在大多数情况下用于获取和构建静态页面。

lib/drupal.ts

import { DrupalClient } from "next-drupal"
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: // Configure the global auth here.
}
)

方法身份验证

您也可以为每个方法调用设置自定义身份验证。

这通常用于进行基于会话/基于用户的身份验证调用。

import { drupal } from "lib/drupal"
const userArticles = await drupal.getResourceCollection("node--article", {
params: {
"filter[uid]": user.id,
},
withAuth: // Set the custom auth here.
})

Bearer

要配置身份验证,请提供 client_idclient_secret 作为选项。

⚠️

您需要在 Drupal 上启用 simple_oauth 模块。

lib/drupal.ts

// Client
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: {
clientId: process.env.DRUPAL_CLIENT_ID,
clientSecret: process.env.DRUPAL_CLIENT_SECRET,
},
}
)
// Method
const article = drupal.getResource(
"node--article",
"293202c9-f603-444e-a426-a5637e2ade2e",
{
withAuth: {
clientId: process.env.DRUPAL_CLIENT_ID,
clientSecret: process.env.DRUPAL_CLIENT_SECRET,
},
}
)

DrupalClient 将获取 **Bearer** 令牌并为您处理过期。

如果您需要自定义 OAuth URL,可以使用 url 选项。

lib/drupal.ts

export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: {
clientId: process.env.DRUPAL_CLIENT_ID,
clientSecret: process.env.DRUPAL_CLIENT_SECRET,
url: `/oauth2/token`,
},
}
)

默认情况下,DrupalClient 使用 /oauth/token 作为默认 URL。


基础认证

您也可以使用基础认证,使用 usernamepassword 进行认证。

⚠️

您需要在 Drupal 上启用 basic_auth 模块。

// Client.
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: {
username: process.env.DRUPAL_USERNAME,
password: process.env.DRUPAL_PASSWORD,
},
}
)
// Method
const articles = await drupal.getResourceCollection("node--article", {
withAuth: {
username: process.env.DRUPAL_USERNAME,
password: process.env.DRUPAL_PASSWORD,
},
})

回调函数

您还可以提供自定义的认证回调函数。回调函数必须返回一个与 Authorization 兼容的头部信息。

// Client
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: () => {
// Do something and return an Authorization header.
},
}
)
// Method
const users = await drupal.getResourceCollection("user--user", {
withAuth: () => {
// Do something and return an Authorization header.
},
})

访问令牌

您也可以传入访问令牌。

// Client
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: {
access_token: "ECYM594IlARGc3S8KgBHvTpki0rDtWx6...",
token_type: "Bearer",
expires_in: 3600,
},
}
)
// Method
const articles = await drupal.getResourceCollection("node--article", {
withAuth: {
access_token: "ECYM594IlARGc3S8KgBHvTpki0rDtWx6...",
token_type: "Bearer",
expires_in: 3600,
},
})

NextAuth

如果您正在使用 NextAuth,您可以使用 getSession 返回的结果。

import { getSession } from "next-auth/react"
const session = getSession(...)
// Client
export const drupal = new DrupalClient(
process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
{
auth: session.accessToken,
}
)
// Method
const articles = await drupal.getResourceCollection("node--article", {
withAuth: session.accessToken,
})