aad_oauth 包是一个 Flutter 库,旨在通过 OAuth2 v2.0 协议简化与 Azure Active Directory 的用户身份验证。它为需要通过 Microsoft 云平台进行身份管理的应用程序提供安全的登录流程。该包负责处理令牌获取、刷新和存储,支持与受 Azure AD 保护的 API 无缝集成。专为面向企业环境的开发者设计,它简化了在 Flutter 应用中实现现代身份验证标准的过程。
适合场景
在企业 Flutter 应用中集成 Azure AD 登录
使用 OAuth2 令牌保护 API 访问
通过 Microsoft 身份验证启用单点登录 (SSO)
处理令牌刷新和持久化
为受监管行业构建合规的身份工作流程
主要特点
Azure AD 的 OAuth2 v2.0 支持
安全的令牌处理和存储
内置的令牌刷新逻辑
Azure AD 应用的简单配置
跨平台兼容性(iOS、Android、Web)
支持 PKCE 流以增强安全性
适合对象
企业移动应用开发人员
需要 Microsoft 身份验证集成的 Flutter 应用
需要符合企业认证策略的应用程序
使用 Azure AD 作为身份提供者的开发人员
需要安全、可扩展的身份验证且代码量最少的项目
使用建议
需要正确的 Azure AD 应用程序注册
需要正确设置重定向 URI
仅限 Azure AD OAuth2 v2.0 终结点
无内置用户界面——需要自定义或第三方登录屏幕
针对 iOS/Android/Web 可能需要特定于平台的配置
原始 README
以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。
Azure Active Directory OAuth
A Flutter OAuth package for performing user authentication against Azure Active Directory OAuth2 v2.0 endpoint. Forked from hitherejoe.FlutterOAuth.
Your minSdkVersion must be >= 20 in android/app/build.gradle section android / defaultConfig to support webview_flutter. Version 19 may build but will likely fail at runtime.
If your app does not have the android.permission.INTERNET permission you must add it to the AndroidManifest
<uses-permission android:name="android.permission.INTERNET"/>
Afterwards you must create a navigatorKey and initialize the library as follow:
final navigatorKey = GlobalKey<NavigatorState>();
// ... staticfinalConfig config = newConfig(
tenant: "YOUR_TENANT_ID",
clientId: "YOUR_CLIENT_ID",
scope: "openid profile offline_access",
// redirectUri is Optional as a default is calculated based on app type/web location
redirectUri: "your redirect url available in azure portal",
navigatorKey: navigatorKey,
webUseRedirect: true, // default is false - on web only, forces a redirect flow instead of popup auth//Optional parameter: Centered CircularProgressIndicator while rendering web page in WebView
loader: Center(child: CircularProgressIndicator()),
postLogoutRedirectUri: 'http://your_base_url/logout', //optional
);
finalAadOAuth oauth = newAadOAuth(config);
This allows you to pass in an tenant ID, client ID, scope and redirect url.
The same navigatorKey must be provided to the top-level MaterialApp.
// ...// Material App must be built with the same navigatorKey// to support navigation to the login route for interactive// authentication.// ...Widgetbuild(BuildContext context) {
returnMaterialApp(
// ...
navigatorKey: navigatorKey,
// ...
);
}
Then once you have an OAuth instance, you can call login() and afterwards getAccessToken() to retrieve an access token:
final result = await oauth.login();
result.fold(
(failure) => showError(failure.toString()),
(token) => showMessage('Logged in successfully, your access token: $token'),
);
String accessToken = await oauth.getAccessToken();
Tokens are stored in Keychain for iOS or Keystore for Android. To destroy the tokens you can call logout():
await oauth.logout();
Web Usage
For web you also have to add some lines to your index.html (see the index.html in the example applications):
Note that when using redirect flow on web, the login() call will not return if the user has not logged in yet because
the page is redirected and the app is destroyed until login is complete. Your application must take care of calling
login() again once reloaded to complete the login process within the flutter application - if login was successful,
this second call will be fast, and will not cause another redirection.
When using redirecting logins with the example application, you will need to click on the login button again following
a successful login to see the token details.
Add your Azure tenant ID, tenantName, client ID (ID of App), client Secret (Secret of App) and redirectUrl in the main.dart source-code:
staticfinalConfig configB2Ca = newConfig(
tenant: "YOUR_TENANT_NAME",
clientId: "YOUR_CLIENT_ID",
scope: "YOUR_CLIENT_ID offline_access",
// redirectUri: "https://login.live.com/oauth20_desktop.srf", // Note: this is the default for Mobile// clientSecret: "YOUR_CLIENT_SECRET", // Note: do not include secret in publicly available applications
isB2C: true,
policy: "YOUR_USER_FLOW___USER_FLOW_A",
tokenIdentifier: "UNIQUE IDENTIFIER A",
navigatorKey: navigatorKey,
);
Afterwards you can login and get an access token for accessing other resources. You can also use multiple configs at the same time.
ADFS Usage
This library only suports ADFS authentication for Flutter mobile applications, not web builds.
Add the following to your pubspec.yaml dependencies:
dependencies:aad_oauth:"^1.0.1"
Contribution
Contributions can be submitted as pull requests and are highly welcomed. Changes will be bundled together into a release. You can find the next release date and past releases in the CHANGELOG file.