Tauri 插件谷歌认证
用于Google OAuth认证的Tauri v2插件,为移动和桌面应用程序提供无缝的Google Sign-In集成.
特征
- 安全 OAuth 2.0 认证 - 在PKCE支持下全面实施OAuth 2.0
- 移动支持 - 使用平台专用API的原生iOS和Android实施
- 桌面支持 - OAuth2 与 macOS、 Windows 和 Linux 本地重定向服务器相通
- 托肯管理 - 托肯刷新和撤销支持
- 警卫第一 - PKCE、安全转向处理和正确错误管理
- 弹性配置 - 自定义方向调整 URI、 HTML 回复和动态端口绑定
安装
锈
将插件添加到您的 Cargo.toml数字 :
[dependencies]
tauri-plugin-google-auth = "0.6"
Java 脚本/ Type 脚本
安装 JavaScript API 软件包 :
npm install @choochmeque/tauri-plugin-google-auth-api
# or
yarn add @choochmeque/tauri-plugin-google-auth-api
# or
pnpm add @choochmeque/tauri-plugin-google-auth-api
配置
1. 登记插件
在你的Tauri应用程序 src-tauri/src/lib.rs数字 :
use tauri_plugin_google_auth;
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_google_auth::init())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
2. 配置权限
添加到您的 src-tauri/capabilities/default.json数字 :
{
"permissions": [
"google-auth:default"
]
}
3. 平台特定设置
iOS 设置
-
配置 Google 签名 - 单位数字 :
- 将您的 Google OAuth 客户端ID 添加到您的应用程序
- 配置 URL 方案于
Info.plist - 见 iOS SETUP.md (英语) 详细指示
-
需要的Info.plist 条目数字 :
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>YOUR_REVERSED_CLIENT_ID</string>
</array>
</dict>
</array>
Android 设置
配置 Google 云控台数字 :
- 创建 OAuth 2. 0 证书
- 添加您的应用程序的 SHA-1 指纹
- 配置授权重定向 URI
见 安得罗得克·斯图普(签名) 用于完整的设置指令.
桌面设置( MacOS, Windows, Linux)
配置 Google 云控台数字 :
- 创建 OAuth 2.0 证书( Web 应用程序类型)
- 添加
http://localhost用于授权重定向 URI - 注意: 插件自动处理动态端口分配
桌面所需的字段数字 :
clientId: 您的 Google OAuth 客户端IDclientSecret: 您的 Google OAuth 客户端秘密( 桌面需要)scopes: 需要至少一个范围
桌面执行使用本地重定向服务器:
- 绑入可用的端口(或如果通过
redirectUri(中文(简体) ) - 在默认浏览器中打开授权 URL
- 从方向获取授权代码
- 向用户显示自定义的成功消息
使用量
基本示例
import { signIn, signOut, refreshToken } from '@choochmeque/tauri-plugin-google-auth-api';
// Sign in with Google
async function authenticateUser() {
try {
const response = await signIn({
clientId: 'YOUR_GOOGLE_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET', // Required for desktop platforms
scopes: ['openid', 'email', 'profile'],
hostedDomain: 'example.com', // Optional: restrict to specific domain
loginHint: '[email protected]', // Optional: pre-fill email
redirectUri: 'http://localhost:8080', // Optional: specify custom redirect URI
successHtmlResponse: '<h1>Success!</h1>' // Optional: custom success message (desktop)
})
console.log('ID Token:', response.idToken);
console.log('Access Token:', response.accessToken);
console.log('Refresh Token:', response.refreshToken);
console.log('Expires at:', new Date(response.expiresAt * 1000));
} catch (error) {
console.error('Authentication failed:', error);
}
}
// Sign out
async function logout(accessToken?: string) {
try {
// With token revocation (recommended)
await signOut({ accessToken });
// Or local sign-out only
// await signOut();
console.log('Successfully signed out');
} catch (error) {
console.error('Sign out failed:', error);
}
}
// Refresh tokens
async function refreshUserToken(storedRefreshToken: string) {
try {
const response = await refreshToken({
refreshToken: storedRefreshToken,
clientId: 'YOUR_GOOGLE_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET' // Required for desktop
});
console.log('New Access Token:', response.accessToken);
} catch (error) {
console.error('Token refresh failed:', error);
}
}
高级配置
import { signIn } from '@choochmeque/tauri-plugin-google-auth-api';
const response = await signIn({
clientId: 'YOUR_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET', // Required for desktop
scopes: [
'openid',
'email',
'profile',
'https://www.googleapis.com/auth/drive.readonly'
],
hostedDomain: 'company.com', // Restrict to company domain
loginHint: '[email protected]', // Pre-fill the email field
redirectUri: 'http://localhost:9000' // Custom port (desktop only)
});
API 参考
类型
SignInOptions
interface SignInOptions {
clientId: string; // Required: Google OAuth client ID
clientSecret?: string; // Required for desktop, Android web flow
scopes?: string[]; // OAuth scopes to request
hostedDomain?: string; // Restrict authentication to a specific domain
loginHint?: string; // Email hint to pre-fill in the sign-in form
redirectUri?: string; // Custom redirect URI (desktop: localhost only)
successHtmlResponse?: string; // Custom HTML shown after auth (desktop only)
flowType?: 'native' | 'web'; // Android only, default: 'native'. See ANDROID_SETUP.md
accessType?: 'offline' | 'online'; // 'offline' requests a refreshToken. Defaults: 'online' on desktop and Android native flow, 'offline' on iOS and Android web flow. Android needs clientSecret for the refreshToken
prompt?: // Desktop/iOS: all values. Android: only 'consent' (forces re-consent), others ignored
| 'none'
| 'consent'
| 'select_account'
| 'consent select_account'
| 'select_account consent';
}
TokenResponse
interface TokenResponse {
idToken?: string; // JWT ID token (requires 'openid' scope)
accessToken: string; // OAuth access token for API calls
scopes: string[]; // List of scopes granted with the access token
refreshToken?: string; // Refresh token (when offline access is granted)
expiresAt?: number; // Token expiration timestamp (seconds since epoch)
}
职能
signIn(options: SignInOptions): Promise<TokenResponse>
启动带有指定选项的 Google Sign- In流程 .
signOut(options?: SignOutOptions): Promise<void>
签署当前用户。 可以选择取消与Google的登录符.
interface SignOutOptions {
accessToken?: string; // Token to revoke (if not provided, local sign-out only)
flowType?: 'native' | 'web'; // Android only, default: 'native'
}
refreshToken(options: RefreshTokenOptions): Promise<TokenResponse>
使用刷新符号刷新访问令牌 .
interface RefreshTokenOptions {
refreshToken?: string; // Required for desktop, Android web flow
clientId: string; // Google OAuth client ID
clientSecret?: string; // Required for desktop, Android web flow
scopes?: string[]; // Required for Android native flow
flowType?: 'native' | 'web'; // Android only, default: 'native'
}
处理错误
try {
await signIn({ clientId: 'YOUR_CLIENT_ID', scopes: ['openid'] });
} catch (error) {
console.error('Sign-in failed:', error);
}
平台支持
| 平台 | 状态 | 执行情况 |
|---|---|---|
| iOS系统 | 支助 | 原始 Google 签名- 通过 SDK 简单的 Google 签名 |
| 机器人 | 支助 | 证书管理器 API |
| 马科斯 | 支助 | OAuth2 带有本地重定向服务器 |
| 窗口 | 支助 | OAuth2 带有本地重定向服务器 |
| 链接 | 支助 | OAuth2 带有本地重定向服务器 |
安全考虑
- 托肯存储: 托肯使用特定平台加密安全存储
- iOS: 键链服务
- Android: 加密共享首选项
- 桌面:应用程序内存(根据需要执行安全存储)
- 仅限 HTTPS: 所有 OAuth 流量使用 HTTPS 进行安全通信
- 捷克: 执行代码交换的证明钥匙,以加强所有平台的安全
- SSRF 保护: 配置了 HTTP 客户端以防止重定向漏洞
- 动态端口绑定: 桌面平台默认使用随机可用的端口
- Token 撤销: 支持以 Google 的撤销端点撤销适当的代号
解决问题
共同问题
iOS:点击登录后立即"用户已取消"出错
- 确保您在 Info 中正确配置 URL 方案 。 列表
- 校验您的客户端标识正确, 并匹配您的 Google Cloud Console 配置
Android: 登录上"配置错误"
- 检查您的 SHA-1 指纹是否添加到 Google Cloud 控制台
- 确保您的软件包名称符合 Google Cloud Console 中的名称
- 验证互联网权限
桌面: 托肯刷新失败
- 保证您通过
clientId财务报告和审定财务报表clientSecret改为refreshToken() - 验证刷新令牌是否有效且未过期
- 确保在初始登录期间请求离线访问范围
Token 刷新失败( 移动)
- 确保在初始登录期间请求离线访问范围
- 请检查access-date=中的日期值 (帮助)
- 如果您的 OAuth 配置需要验证客户端机密
演示应用程序
演示应用程序可用于 examples/google-auth-demo/ 显示所有插件功能 :
cd examples/google-auth-demo
pnpm install
pnpm tauri dev
捐款
欢迎捐款! 请随意提交拉力请求 对于重大变动,请先开出一个问题来讨论你想要改变什么.
- 叉子存储器
- 创建您的特性分支( E)
git checkout -b feature/amazing-feature(中文(简体) ) - 提交更改( E)
git commit -m 'Add some amazing feature'(中文(简体) ) - 推向分行(
git push origin feature/amazing-feature(中文(简体) ) - 打开拉请求
许可证
这个项目根据麻省理工学院许可证颁发——见 自由主义 详细文件.
承认
支助
如果遇到任何问题或有问题,请将问题提交至 GitHub 仓库。 。 。 .