Flutter/Dart 中通过 OAuth2 生成 Access Token 返回 Null

问题描述 投票:0回答:1

我的应用程序位于 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 作为访问令牌。

flutter coding-style access-token bearer-token oauth2client
1个回答
0
投票

还有另一种方法可以解决您的 Azure 身份验证问题。 这个不使用 OAuth。

azure_silent_auth

试试这个包。但您需要知道 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();
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.