@authup/core-http-kit (英语)
为 Authup API 键入了 HTTP 客户端,带有一个得到并刷新令牌的钩子.
停止对 Authup 服务器进行手写取呼叫、查询字符串和更新 .
安装 • 妇女 使用量 • 妇女 API 密码 • 妇女 文档
为什么?
Authup的管理API及其OAuth2端点都是平面HTTP,因此任何客户端都可行. 否则您自己会写到请求周围的部分:每个实体的URL, rapiq查询字符串 { data, meta } 响应形状、 符号赠与和 符号过期时的重试.
| 关切 | 没有它 | 用这个 |
|---|---|---|
| 终点 | 每个呼叫的 URL 和响应类型 | client.user.getMany(), (中文(简体) ), client.role.create(),... 每个实体一个子API,按域类型键入 @authup/core-kit |
| 查询 | 编码 filter, (中文(简体) ), sort, (中文(简体) ), fields, (中文(简体) ), include 财务报告和审定财务报表 page 手动 | 过 filters, (中文(简体) ), sorts, (中文(简体) ), fields, (中文(简体) ), relations, (中文(简体) ), pagination这是给你的序列 |
| 键 | 通话 /token,存储符号,设置信头 | client.token.createWithPassword() 和兄弟姐妹,加 ClientAuthenticationHook |
| 过期 | 抓一个 401,更新,重放 | 钩子更新在一 401 或符号出错并重放请求一次 |
| 测试 | 嘲笑 fetch | createFakeClient() 从 @authup/core-http-kit/testing 按路径的答案 |
安装
npm install @authup/core-http-kit
仅限无害环境管理。 节点.js >=26.0.0浏览器 fetch。没有同伴依赖关系.
使用量
创建客户端
import { Client } from '@authup/core-http-kit';
const client = new Client({ baseURL: 'https://auth.example.com' });
const { data: users, meta } = await client.user.getMany({
filters: { realmId: '<realm id>' },
sorts: { name: 'ASC' },
pagination: { limit: 20 },
});
// meta.total, meta.schema
const { data: user } = await client.user.getOne(users[0].id);
baseURL没有默认 :Client发送相对的 URL, 除非你设置它 .API_URL_DEFAULT(单位:千美元)http://localhost:3001)为想要倒计时的呼叫者导出.- 集合读取答案
{ data: T[], meta: { total, limit?, offset?, schema? } }。记录读取和每个字母回答{ data: T, meta }。 。 。 . - 查询需要
filters, (中文(简体) ),sorts, (中文(简体) ),fields, (中文(简体) ),relations财务报告和审定财务报表pagination,或已经组装的 rapiqIQuery(例如,一个与and()编号 :or()从@rapiq/core) (中文(简体) ). 服务器会放弃实体计划所不允许的一切;meta.schema列出它的工作.
实体 APIs
每个实体在客户端上都有子API. 大多数动词带有相同的动词:
| 动词 | 请求 |
|---|---|
getMany(query?) | GET /<collection> |
getOne(id, query?) | GET /<collection>/:id |
create(data) | POST /<collection> |
update(id, data) | POST /<collection>/:id |
createOrUpdate(idOrName, data) | PUT /<collection>/:idOrName (真人、客户、角色、范围、用户、授权、身份提供者) |
delete(id) | DELETE /<collection>/:id |
getStats(query?) | GET /<collection>/@stats,分组计数(realm,客户端,范围,身份提供者,密钥,信任锚地,用户,路径,角色,政策,权限,会话,事件) |
getSchema() | GET /<collection>/@schema,可查询词汇表(除 userAuthenticator(中文(简体) ) |
并不是每个实体都提供每个动词:只读事件,只读会话和会话符号(加) deleteMany),相交点,例如: userRole 或者说 clientScope 携带无 update。一些额外携带,例如 client.client.rotateSecret(id, payload?), (中文(简体) ), client.session.deleteMany(query?) 财务报告和审定财务报表 client.realm.getOne(id),其 meta.endpoints 拥有王国 issuer, (中文(简体) ), openidConfiguration 财务报告和审定财务报表 jwks URLs (英语).
按实体类型选择子API, 使用 pickEntityAPI。每个动词在结果上都是可选的,所以每个方法都注意:
import { EntityType } from '@authup/core-kit';
import { pickEntityAPI } from '@authup/core-http-kit';
const api = pickEntityAPI(client, EntityType.ROLE);
if (api && api.getMany) {
const { data: roles } = await api.getMany({ pagination: { limit: 10 } });
}
获取一个符号
client.token 覆盖 /token 结束点 :
const grant = await client.token.createWithPassword({
username: 'admin',
password: 'start123',
realm_name: 'master',
});
client.setAuthorizationHeader({ type: 'Bearer', token: grant.access_token });
| 方法 | 赠款 |
|---|---|
createWithPassword({ username, password, otp?, realm_id?, realm_name? }) | password |
createWithClientCredentials({ client_id, client_secret }) | client_credentials |
createWithRefreshToken({ refresh_token }) | refresh_token |
createWithAuthorizationCode({ code, redirect_uri, code_verifier? }) | authorization_code |
createWithDeviceCode({ device_code, client_id? }) | urn:ietf:params:oauth:grant-type:device_code |
introspect({ token }) | POST /token/introspect |
revoke({ token }) | POST /token/revoke |
持有第二个系数的用户添加 otp (一个TOTP或恢复代码)到密码授权.
保持新标志
ClientAuthenticationHook 附加到一个或多个客户端, 当服务器要求一个时会获得一个符号 :
import { Client, ClientAuthenticationHook, createClientTokenCreator } from '@authup/core-http-kit';
const client = new Client({ baseURL: 'https://auth.example.com' });
const hook = new ClientAuthenticationHook({
tokenCreator: createClientTokenCreator(
{ id: '<client id>', secret: '<client secret>' },
{ client: { baseURL: 'https://auth.example.com' } },
),
});
hook.attach(client);
- 钩子没有在前面取出一个符号。 第一项请求没有提出;a
401(或体中符号错误代码)tokenCreator组合Authorization: Bearer并重放请求一次. - 同时发生的失败共用一个
tokenCreator电话. - 与
timer(默认情况下)它再次续约 60秒前expires_in跑出来. - 密钥出错( N)
JWK_*代码)不设置头并拒绝不更新;失败的更新也会不设置. createUserTokenCreator({ name, password, realmId?, realmName? }, { client })是密码授予对应的。 你可以通过任何() => Promise<OAuth2TokenGrantResponse>换句话说.- 钩子发出
refreshFinished, (中文(简体) ),refreshFailed, (中文(简体) ),headerSet财务报告和审定财务报表headerRemoved(单位:千美元)ClientAuthenticationHookEventName) (中文(简体) ).
设备授权
一个没有浏览器的设备 要求一个代码,显示它,和民调:
import { isClientError } from '@authup/core-http-kit';
const device = await client.deviceAuthorization.create({ client_id: '<client id>', scope: 'openid' });
console.log(`Open ${device.verification_uri_complete}`);
async function poll(interval: number) {
await new Promise((resolve) => { setTimeout(resolve, interval * 1000); });
try {
return await client.token.createWithDeviceCode({
device_code: device.device_code,
client_id: '<client id>',
});
} catch (e) {
const error = isClientError(e) ? e.response?.data?.error : undefined;
if (error === 'authorization_pending') return poll(interval);
if (error === 'slow_down') return poll(interval + 5);
throw e;
}
}
const grant = await poll(device.interval);
client.deviceAuthorization.lookup / approve / deny({ user_code }) 是批准代码的页面的呼叫;它们骑着客户自己的持单人.
检查权限
client.authorization.check() 询问哪个服务器允许呼叫者持有, 以及哪个域:
const permissions = await client.authorization.check({ names: ['user_read', 'user_update'] });
const canUpdate = permissions.some((permission) => permission.name === 'user_update');
- 奥米
names检查所有许可.realms财务报告和审定财务报表clients选择哪个定义由域和拥有定义的客户端进行评估;两者都默认为[null](定义由无域和无客户所有). 过own(你的地盘,或者客户 你的令牌是发给),ownOrNull(加上未拥有),granted(加上你持有的每一项定义的拥有者)或身份证明清单(null. . . . targetRealms选择每个定义对照的资源域。 默认为ownOrNull(呼叫方域加全球行); 通过own或 域 id 列表 (null(单位:千美元).- 每个条目都包含
name,拥有realmId编号 :clientId(无效时允许)和targetRealms它能撑住 只有呼叫者在至少一个被请求的目标域中持有的定义才会出现,因此不存在拒绝的手段. checkWithMaxAge()ưμ㼯amaxAge,直到日期或时间政策的秒数可以改变答案.client.authorization.get()读取无身份许可目录。 它需要一个permission_read, (中文(简体) ),permission_update或者说permission_delete。 。 。 .
测试
import { createFakeClient } from '@authup/core-http-kit/testing';
const fake = createFakeClient({
handlers: {
'GET /users/:id': (req) => ({ data: { id: req.params.id, name: 'alice' }, meta: {} }),
},
});
const { data } = await fake.user.getOne('1');
// fake.requests lists every request: method, url, body, params, headers
- 处理器密钥是
'<METHOD> <path>'与:param部分,或'*'做为包罗万象. - 未匹配的请求答案
fallback,默认情况下{ data: [], meta: { total: 0 } }。 。 。 .baseURL默认为http://fake.test。 。 。 . - Urlencoded body (token requests) 被记录为普通对象.
选项
ClientAuthenticationHookOptions数字 :
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
tokenCreator | () => Promise<OAuth2TokenGrantResponse> | 所需经费 | 需要签章时打电话 |
timer | boolean | true | 在信使到期前60秒续签 |
baseURL | string | 接受兼容性; 钩子没有读取 |
Client 选择 hapic 的客户端选项(baseURL, (中文(简体) ), headers(中文(简体) ).
API 密码
| 导出 | 仁爱 | 目的 |
|---|---|---|
Client, (中文(简体) ), IClient | 类,接口 | HTTP客户及其合同,每个实体和工作流程有一个子API |
ClientAuthenticationHook | 类 | 为附属客户获取、更新和应用代号 |
ClientAuthenticationHookEventName | 语句 | 钩子发射事件 |
createClientTokenCreator, (中文(简体) ), createUserTokenCreator | 函数 | 客户证书和密码证书的创建者 |
TokenCreator | 类型 | () => Promise<OAuth2TokenGrantResponse> |
pickEntityAPI | 函数 | 以 EntityType 字符串 |
EntityAPIDispatch, (中文(简体) ), ClientEntityAPIKey | 类型 | 动词可选表面 pickEntityAPI 返回,并输入它接受的密钥 |
EntityRecordResponse, (中文(简体) ), EntityCollectionResponse | 类型 | 这个 { data, meta } 响应形状 |
EntityStatsQuery, (中文(简体) ), EntityStatsResponse, (中文(简体) ), buildStatsURL | 类型,函数 | 这个 @stats 读取 |
EntityQueryInput, (中文(简体) ), buildQueryString | 类型,函数 | 每个读取的查询输入及其 URL 序列化 |
UserAPI, (中文(简体) ), RoleAPI, (中文(简体) ), OAuth2TokenAPI, (中文(简体) ), AuthorizationAPI,, , , , , , , , . | 类 | 子APIs,每个有 I*API 接口和 *CreatePayload 编号 : *UpdatePayload 类型 |
AuthorizeInfo, (中文(简体) ), ClientSummary, (中文(简体) ), RealmSummary, (中文(简体) ), StatusResponse | 类型 | 工作流程响应形状 |
isClientError, (中文(简体) ), getClientErrorCode | 函数 | 探测出一个黑道 ClientError 读它 code |
setHeader, (中文(简体) ), unsetHeader | 函数 | 信头助手从 hapic 再出口 |
CookieName | 语句 | 饼干名称 Authup 网络套件在下面存储符牌 |
API_URL_DEFAULT | 针头 | http://localhost:3001 |
@authup/core-http-kit/testing 出口 FakeClient, (中文(简体) ), createFakeClient, (中文(简体) ), matchRoute 编辑 Fake* 类型.
页:1
- Token 调用客户端
Authorization头曰.client.token.*财务报告和审定财务报表client.deviceAuthorization.create移除客户所携带的头条,因此体内的客户证书从不与持证人相混. 过{ authorizationHeaderInherit: true }(或{ authorizationHeader }作为第二个送出一个论点的论据,例如用你自己的证书进行回顾:client.token.introspect({ token }, { authorizationHeaderInherit: true })。 。 。 . - 错误消息来自服务器 . 如果请求失败, 客户端将替换错误
message与身体的message当它有一个,所以 URL 已经不在它. - 刷新每一次. 如果重播的请求再次失败, 它的错误会到达您手中 .
许可证
由 所制
现按 Apache 2.0 许可证。 。 。 .