我的应用程序位于 Flutter/Dart 中。我正在尝试使用 Azure 凭据通过 OAuth2 生成访问令牌。一旦我使用凭据登录,它就会成功授权,但它不会自动重定向到应用程序,并且当我退出页面返回应用程序时,它会将令牌打印为空。
代码:
OAuth2Client client = OAuth2Client(
redirectUri: 'https://oauth.pstmn.io/v1/browser-callback',
customUriScheme: '${customUri}',
authorizeUrl: 'https://login.microsoftonline.com/${tenantID}/oauth2/authorize',
tokenUrl: 'https://login.microsoftonline.com/${tenantID}/oauth2/token',
);
try{
AccessTokenResponse tknResp = await client.getTokenWithAuthCodeFlow(
clientId: '${clientID}',
clientSecret: '${clientSecret}',
scopes: ['api://${tenantID}/Users.Login'],
);
print("TOKEN IS: ${await tknResp.tokenType} ${await tknResp.scope} ${await tknResp.accessToken}");
}catch(e){
print("TOKEN ERROR IS: ${e}");
}
注意:我通过Android Studio运行它
谢谢!
我尝试运行上面的代码,但我收到 Null 作为访问令牌。
还有另一种方法可以解决您的 Azure 身份验证问题。 这个不使用 OAuth。
试试这个包。但您需要知道 client-id、tenant-id,并且需要将 http://localhost:3000 重定向 URI 添加到 azure 门户上的 azure 应用程序授权。
此软件包可以解决您的问题之一。我,e
not redirecting back to the application after authentication
。使用 PCAuthenticator
而不是示例中提供的 DefaultAuthenticator
。
PCAuthenticator
创建一个单独的窗口来加载身份验证屏幕,而不是将其重定向到浏览器。身份验证完成后,此新窗口也会关闭。您可以修改它并创建您自己的自定义身份验证器并在 AzureAuth
构造函数中使用它。
就您的第二个问题而言,成功登录后,您可以随时随地使用
AzureAuth->getAccessToken
获取访问令牌。如果令牌过期了,它甚至会为您刷新令牌。
此软件包默认安全地保存访问令牌,以便您下次使用
AzureAuth->silentLogin
进行静默登录。
希望这有帮助。
class AuthenticationHandler {
static final AuthenticationHandler _instance =
AuthenticationHandler._internal();
factory AuthenticationHandler() {
return _instance;
}
AuthenticationHandler._internal();
// !! USE PCAuthenticator here instead of DefaultAuthenticator
final AzureAuth _microsoftAuthenticator = AzureAuth(
authenticatorProvider: DefaultAuthenticator(
'https://login.microsoftonline.com/{tenant-id}/',
["openId", "offline_access"],
'{client-id}',
'&prompt=select_account',
3000, // localhost redirect uri port
),
);
Future<void> login() async {
await _microsoftAuthenticator.login();
}
Future<void> silentLogin() async {
await _microsoftAuthenticator.silentLogin();
}
Future<void> logout() async {
await _microsoftAuthenticator.logout();
}
}