@baukit/auth-native
提供商中立本地的OIDC授权码客户端与S256 PKCE,标准发现,安全存储和浏览器-流量端口,刷新自转,以及本地首个签出. 核心没有反应,路由器,或产品UI依赖.
import { createExpoOidcClient } from '@baukit/auth-native/expo';
import * as AuthSession from 'expo-auth-session';
const auth = createExpoOidcClient({
issuer: 'https://identity.example.com/tenant',
clientId: 'product-mobile',
redirectUri: AuthSession.makeRedirectUri({ scheme: 'product', path: 'oauth' }),
offlineAccess: true,
});
await auth.initialize();
const result = await auth.signIn();
if (result.status === 'cancelled') {
// Restore focus or announce cancellation. This is not an authentication error.
}
发行人只能通过 /.well-known/openid-configuration; 提供者专用路径从未被制造. 在成功进行授权码交换后,再提出经认证的用户信息请求. 它没有空 sub 是存储在永久会话中的权威主题。 软件包不相信一个未经核实的,本地解码的ID-token的声称是身份.
session() 曝光主题,访问符,可选刷新和ID符,以及 issuedAt 财务报告和审定财务报表 expiresAt 以相差相差几毫秒计的时标。 当提供者省略时, 刷新回复保留先前的刷新符或ID符 。 当配置的刷新窗口内的会话没有刷新符号时, accessToken() 清除后返回 undefined; 呼叫者应再次报到.
refreshOnRestore 制造 initialize() 在解析前刷新已过期的存储会话 。 被拒绝的刷新结束会话, 而网络错误保留它 。 它默认为虚假 createWorkOsNativeClient 把它设定为真实的.
refreshLeewaySeconds 默认值为 30 秒; 刷新窗口是该值中较小的, 并且是符号寿命的一半, 按 expiresAt - issuedAt。 。 。 .
offlineAccess 故意默认 false; 设置为 true 仅在提供者被配置以发布刷新符号时 offline_access。 。 。 . accessToken() 共享一个刷新 并行的呼叫者。 过 { forceRefresh: true } 在401后绕出主动失效窗口,同时仍然加入任何已经在飞行中的刷新.
终端刷新拒绝( E)invalid_grant, (中文(简体) ), invalid_token,或 HTTP 400/401 清除会话并决心 undefined。订阅 subscribeSessionExpired() 以停止排程并移动 UI 到签约状态。 网络、错误的响应、费率限制和提供者 5xx 故障保存存储会话并用消毒器拒绝 OidcError 谁 retryable 属性是 true。 。 。 .
subscribeSessionExpired() 报告 refresh_rejected, (中文(简体) ), refresh_unavailable,或 profile_erased在带有代码的后端 401 上 profile_erased电话 clearSession({ reason: 'profile_erased' })它澄清了当地会议的问题,并给出了每次通话的理由。 平面 clearSession() 释放什么。 OIDC 坚持在下方使用武力标记 storageKeyPrefix所以下一个 signIn() 请求 prompt=login 即使在重新装入之后 一个失败或被取消的登录会保存标记;一个成功的登录会删除它. 新的认证给予提供者新的 auth_time 重新登入配置文件.
signOut() 在提供者互动之前删除本地会话。 然后它尝试了发现的会场终点。 丢失、 取消或失败的供应商登录会持续显示一个故障安全旗, 所以下一次 signIn() 包含 prompt=login;只有在提供者登录或后来成功登录后才去除该旗帜. 腐败的安全存储状态,包括无 issuedAt,删除后按签出处理.
使用 safeAuthErrorMessage(error) 在UI边界。 错误只包含允许列表库代码/消息和可选的HTTP状态编号. 提供者机构,授权代码,令牌,以及适配器例外消息从不被复制成错误或日志.
默认的 Expo 切入点使用 expo-auth-session, (中文(简体) ), expo-secure-store,以及 expo-web-browser,这些是同伴的依赖关系。 用于确定性测试或其他原生堆栈,构造 NativeOidcClient 与你自己 SecureStoragePort, (中文(简体) ), BrowserFlowPort, (中文(简体) ), fetch和时钟.
会话和强制日志密钥使用点分隔符 。 默认前缀编码
发行人和客户端ID带有安全Store安全字符. 习惯 storageKeyPrefix
必须是非空的,只包含 ASCII 字母,数字, ., (中文(简体) ), - 财务报告和审定财务报表 _。 。 。 .
建筑在访问存储前拒绝无效的前缀 。 没有重写密钥
需要适配器。 旧密钥没有迁移 .
世博会产品可以通过 storage 端口为
createExpoOidcEnvironment 或者说 createExpoOidcClient。这支持网络
本地Storage适配器或产品自有兼容性/迁移包装器,同时
保留标准的 Expo 浏览器流 .
主题登录页面
登录主题可以匹配应用程序显示的主题
通过 OAuth state。将段落传递到 signIn 并赏赐博览会的流向
en源 :
import { appearanceStateDecoration } from '@baukit/auth-native';
import { createExpoOidcClient } from '@baukit/auth-native/expo';
import * as Crypto from 'expo-crypto';
const auth = createExpoOidcClient(config, {
randomBytes: (size) => Crypto.getRandomBytesAsync(size),
});
await auth.signIn({ stateDecoration: appearanceStateDecoration({ mode: 'dark' }) });
国家变成 ap1.d.<64 hex characters>,或
ap1.d.<PRIMARY>.<SECONDARY>.<nonce> 当你通过两个 #RRGGBB 颜色.
decoratedAuthorizationState 需要至少32个随机字节,只接受
ASCII 每个段的字母和数字. 非斯使国家令人厌恶,和
客户端仍然将返回状态与其发送状态进行比较.
装饰从不阻碍登录。 无 randomBytes,或当 en
源投出或片段结构不当, 流使用 Authsession 的自身状态
并登录页面显示其默认主题. createExpoBrowserFlow 一样
自动流动,用于生产 NativeOidcEnvironment 手边.
其它 BrowserFlowPort 执行可能忽略 stateDecoration。 。 。 .
状态在授权 URL 中行走, 因此提供者及其访问日志
见之. 把外观提示放在那里,从不使用数据. 来自全球之声的 Keycloak 主题
baukit CLI 的 OIDC 模板解码 ap1 格式.
边界
软件包拥有本地的 OIDC 流,会话存储并刷新. 没有屏幕,没有 导航,没有授权逻辑;登录用户可以做的是由产品和 由服务器执行 .
核心没有反应、路由器或产品UI依赖性,博览会入口是一个单独的入口
子路径。 构造 NativeOidcClient 与你自己 SecureStoragePort, (中文(简体) ), BrowserFlowPort, (中文(简体) ), fetch, (中文(简体) ),
和钟,当你在另一个本地堆栈 或想要一个决定性测试.
@baukit/auth-web 是浏览器的同一份合同.
提供者适配器
@baukit/auth-native/clerk-expo 创建一个 ClerkNativeClient 及其反应
Provider 一起来 安装可选选项 @clerk/expo 和反应对等器,应用
办事员博览会的配置插件,并将产品包装在返回的提供者中.
提供可出版的钥匙和 SecureStoragePort该桥使用办事员的
主机登录和符号缓存 . @baukit/auth-native/clerk 导出客户端
和SDK端口分别用于其他集成.
@baukit/auth-native/workos 出口 createWorkOsNativeClient供应
AuthKit 公共客户端ID和现有的博览会浏览器/存储环境.
它通过浏览器端口运行S256 PKCE并使用WorkOS的交换符
JSON公共客户API. 它在安全存储和清空中储存刷新符牌
在结束提供者会话之前。 应用程序中没有 API 密钥 .
供应商客户份额 initialize, (中文(简体) ), session, (中文(简体) ), subscribe, (中文(简体) ), accessToken, (中文(简体) ),
signIn, (中文(简体) ), signOut, (中文(简体) ), clearSession 财务报告和审定财务报表 subscribeSessionExpired 与OIDC合作.
本地 WorkOS 用户 NativeOidcClient 并继承常住者 prompt=login
请求。 办事员发射 profile_erased 并清除本地会话,但是它的 SDK
桥梁不会坚持武力标记或强制重新认证.
办事员需要使用 JWT 模板 auth_time 重新登入和新供应商
在后端允许一个被删除的主题之前进行认证.