Skip to content

Instantly share code, notes, and snippets.

@riscait
Created April 7, 2020 23:19
Show Gist options
  • Save riscait/6420d891427730c859025b6458e0a1b7 to your computer and use it in GitHub Desktop.
Save riscait/6420d891427730c859025b6458e0a1b7 to your computer and use it in GitHub Desktop.
/// Apple認可のクレデンシャルを要求し、(取得できた場合は)フルネームも一緒に返却する
Future<AuthCredentialWithApple> requestAppleIdCredential() async {
// apple_sign_inパッケージによるリクエスト実行関数
final authResult = await AppleSignIn.performRequests([
// メールアドレスとフルネーム、取得したいスコープを指定する
// メールアドレスとフルネームどちらも不要な場合は空のListを指定すればOK
const AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])
]);
// エラーハンドリング
if (authResult.error != null) {
throw Exception('Sign in failed: ${authResult.error}');
}
// 認可結果
switch (authResult.status) {
// 認可成功
case AuthorizationStatus.authorized:
// AppleIDのクレデンシャル
final appleIdCredential = authResult.credential;
// Apple認可で得たID Tokenと認可コードを使用してOAuthクレデンシャルを作成
const oAuthProvider = OAuthProvider(providerId: 'apple.com');
final oAuthCredential = oAuthProvider.getCredential(
idToken: String.fromCharCodes(appleIdCredential.identityToken),
accessToken: String.fromCharCodes(appleIdCredential.authorizationCode),
);
// フルネームを使用する場合は、この関数内でAppleIdCredentialから取得しておく必要がある
// AuthCredentialからはfullNameが取得できない
// フルネーム不要の場合は`oAuthCredential`を直接返却すればOK
final credentialWithApple = AuthCredentialWithApple(
authCredential: oAuthCredential,
givenName: appleIdCredential.fullName.givenName,
familyName: appleIdCredential.fullName.familyName,
);
return credentialWithApple;
// ユーザーがキャンセルした場合
case AuthorizationStatus.cancelled:
return null;
// エラーが発生した場合
case AuthorizationStatus.error:
throw Exception('Sign in failed: ${AuthorizationStatus.error}');
}
// 到達不可能だと思うけど、消すと `missing_return` と怒られる
return null;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment