signIn method

Request credential for the currently signed in Apple account.

Implementation

@override
Future<SocialSignInResultInterface> signIn(BuildContext context) async {
  stateCode = generateString(10); // simple state code
  final rawNonce = generateNonce();
  final state = buildState(p: 80);
  final nonce = sha256ofString(rawNonce);

  var authorizedResult = await Navigator.of(context).push(
    MaterialPageRoute(
      builder: (context) => SocialSignInPageDesktop(
          url: "${authUrl()}&state=$state&nonce=$nonce",
          redirectUrl: '',
          userAgent: pageInfo.userAgent,
          title: pageInfo.title,
          centerTitle: pageInfo.centerTitle,
          onPageFinished: (String url) {
            if (url.contains("error=")) {
              throw Exception(Uri.parse(url).queryParameters["error"]);
            } else if (url.startsWith("http://localhost")) {
              var uri = Uri.parse(url);
              if (uri.queryParameters.containsKey('id_token') &&
                  uri.queryParameters.containsKey('state') &&
                  uri.queryParameters['state'] == state) {
                return uri.queryParameters["id_token"];
              } else {
                throw Exception();
              }
            }
            return null;
          }),
    ),
  );
  if (authorizedResult == null ||
      authorizedResult.toString().contains('access_denied')) {
    throw SocialSignInException(
        status: SignInResultStatus.cancelled,
        description: "Sign In attempt has been cancelled.");
  } else if (authorizedResult is Exception) {
    throw SocialSignInException(description: authorizedResult.toString());
  }

  String authorizedCode = authorizedResult;
  debugPrint("authorized_code: $authorizedCode");

  return AppleSignInResult(SignInResultStatus.ok,
      state: stateCode, nonce: rawNonce, idToken: authorizedResult);
}