Wear 내 인증

독립형 시계가 있으면, 이제 호환 앱 없이 Wear OS 앱을 시계에서 완벽하게 실행할 수 있습니다. 이 새로운 기능은 Wear OS 독립형 앱이 클라우드의 데이터에 액세스해야 할 때 자체적으로 인증을 관리해야 한다는 것을 의미하기도 합니다. Wear OS는 독립형 Wear 앱이 사용자 인증 정보를 얻을 수 있도록 여러 가지 인증 방식을 지원합니다.

현재 Wear OS는 다음과 같은 인증 방식을 지원합니다.

다음 섹션에서는 위의 인증 방식을 Wear 앱에 통합하는 방법을 설명합니다.

Google 로그인

Google 로그인을 사용하면 사용자가 기존 Google 계정으로 로그인할 수 있습니다. Google 로그인은 최상의 사용자 환경을 제공하며 지원하기 쉽습니다. 특히, 핸드헬드 앱에서 이러한 솔루션을 이미 구현하는 경우 더욱 그렇습니다.

Google 로그인은 iOS에서도 잘 작동하므로 가장 선호되는 솔루션입니다. 다음 섹션에서는 기본 Google 로그인 통합을 완료하는 방법을 설명합니다.

기본 요건

Wear 앱에서 Google 로그인 통합을 시작하기 전에 Google API 콘솔 프로젝트를 구성하고 Android 스튜디오 프로젝트를 설정해야 합니다. 자세한 내용은 Google 로그인 통합 시작 가이드를 참조하세요.

참고: 백엔드 서버와 통신하는 앱 또는 사이트에서 Google 로그인을 사용하는 경우, 백엔드 서버에 대한 OAuth 2.0 웹 애플리케이션 클라이언트 ID를 만듭니다. 이 클라이언트 ID는 앱의 클라이언트 ID와 다릅니다. 자세한 내용은 서버 쪽 액세스 사용을 참조하세요.

중요: 앱이 백엔드 서버와 통신하는 경우, HTTPS를 통해 사용자의 ID 토큰을 전송하여 서버에서 현재 로그인한 사용자를 안전하게 식별합니다. 백엔드 서버에서 사용자를 인증하는 방법을 알아보려면 백엔드 서버에서 인증을 참조하세요.

앱에 Google 로그인 통합

Google 로그인을 Wear 앱에 통합하려면 다음 단계를 따르세요.

  1. Google 로그인을 구성합니다.
  2. Google 로그인 버튼을 추가합니다.
  3. 로그인 버튼을 클릭하면 로그인 흐름을 시작합니다.

Google 로그인 구성 및 GoogleApiClient 객체 빌드

로그인 활동의 onCreate 메서드에서 앱에 필요한 사용자 데이터를 요청하도록 Google 로그인을 구성합니다. 그런 다음, Google 로그인 API에 대한 액세스 권한과 지정한 옵션이 있는 GoogleApiClient 객체를 만듭니다.

Kotlin

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. The ID and basic profile are included in DEFAULT_SIGN_IN.
    // If you need to request additional scopes to access Google APIs, specify them with
    // requestScopes().
    googleApiClient = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build()
            .let { signInConfigBuilder ->
                // Build a GoogleApiClient with access to the Google Sign-In API and the
                // options specified in the sign-in configuration.
                GoogleApiClient.Builder(this)
                        .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                        .addApi(Auth.GOOGLE_SIGN_IN_API, signInConfigBuilder)
                        .build()
            }
    

자바

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. The ID and basic profile are included in DEFAULT_SIGN_IN.
    // If you need to request additional scopes to access Google APIs, specify them with
    // requestScopes().
    GoogleSignInOptions.Builder signInConfigBuilder = new GoogleSignInOptions
            .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

    // Build a GoogleApiClient with access to the Google Sign-In API and the
    // options specified in the sign-in configuration.
    googleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, signInConfigBuilder)
            .build();
    

앱에 Google 로그인 버튼 추가

  1. 앱의 레이아웃에 SignInButton을 추가합니다.
  2.      <com.google.android.gms.common.SignInButton
         android:id="@+id/sign_in_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />
        
  3. 앱의 onCreate() 메서드에서 클릭 시 사용자를 로그인하도록 버튼의 OnClickListener를 등록합니다.
  4. Kotlin

        findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
        

    자바

        findViewById(R.id.sign_in_button).setOnClickListener(this);
        

로그인 인텐트 만들기 및 로그인 흐름 시작

로그인 버튼이 클릭되면 getSignInIntent 메서드로 로그인 인텐트를 만들고 startActivityForResult 메서드로 인텐트를 시작하여 onCLick() 메서드에서 로그인 버튼 탭을 처리합니다.

Kotlin

    Auth.GoogleSignInApi.getSignInIntent(googleApiClient).also { signInIntent ->
        startActivityForResult(signInIntent, RC_SIGN_IN)
    }
    

자바

    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
    

로그인에 사용할 Google 계정을 선택하라는 메시지가 사용자에게 표시됩니다. 프로필, 이메일 openid 이외의 범위를 요청한 경우 리소스에 관한 액세스 권한을 부여하라는 메시지도 표시됩니다.

마지막으로, 활동의 onActivityResult 메서드에서 getSignInResultFromIntent를 사용하여 로그인 결과를 검색합니다. 로그인 결과를 검색한 후 isSuccess 메서드를 사용하여 로그인이 성공했는지 확인할 수 있습니다. 로그인이 성공한 경우, getSignInAccount 메서드를 호출하여 사용자 이름 등의 로그인한 사용자 정보가 포함된 GoogleSignInAccount 객체를 가져올 수 있습니다.

Kotlin

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
        super.onActivityResult(requestCode, resultCode, data)

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...)
        if (requestCode == RC_SIGN_IN) {
            Auth.GoogleSignInApi.getSignInResultFromIntent(data)?.apply {
                if (isSuccess) {
                    // Get account information
                    fullName = signInAccount?.displayName
                    mGivenName = signInAccount?.givenName
                    mFamilyName = signInAccount?.familyName
                    mEmail = signInAccount?.email
                }
            }
        }
    }
    

자바

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...)
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult signInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (signInResult.isSuccess()) {
                GoogleSignInAccount acct = signInResult.getSignInAccount();

                // Get account information
                fullName = acct.getDisplayName();
                givenName = acct.getGivenName();
                familyName = acct.getFamilyName();
                email = acct.getEmail();
            }
        }
    }
    

Google 로그인을 구현하는 샘플 앱을 보려면 샘플 앱을 참조하세요.

OAuth 2.0 지원

Wear는 제3자 앱이 웹 서비스에서 사용자를 인증할 수 있도록 OAuth 2.0 지원을 제공합니다. Wear 기기의 화면 공간이 제한적이라는 점을 감안하여, Wear OS OAuth 지원은 독립형 시계 앱이 휴대전화를 통해 OAuth 인증 흐름을 완료할 수 있도록 합니다. 독립형 앱은 요청 및 응답 URL 모델을 사용하여 사용자를 인증하고 서비스에 액세스하기 위한 OAuth 토큰을 받습니다.

참고: Wear 2.0 앱에 함께 제공되는 전화 앱이 있는 경우 Wear 앱과 전화 앱에 동일한 패키지 이름을 사용합니다.

기본 요건

시작하기 전에 백엔드 서버에 대한 OAuth 2.0 웹 애플리케이션 클라이언트 ID를 만듭니다. 이 클라이언트 ID는 앱의 클라이언트 ID와 다릅니다. Google API 콘솔에서 서버에 대한 클라이언트 ID를 찾거나 만들 수 있습니다.

흐름

  1. 사용자가 제3자 앱을 사용하여 승인이 필요한 작업을 수행합니다.
  2. 제3자 앱이 Wear 서비스 API sendAuthorizationRequest()를 사용해서 Wear OS 호환 앱에 요청을 보내 승인 URL이 있는 웹 보기를 엽니다.
  3. URL 웹사이트에서 사용자를 승인합니다(사용자 이름과 비밀번호 확인, 2단계 인증 수행 등).
  4. 인증이 성공 또는 실패한 후 사이트에서 인증 코드를 사용하여 요청에 지정된 콜백 URL(앱의 백엔드 서버)을 호출합니다.
  5. 백엔드 서버에서 인증 코드를 OAuth 서버의 액세스 토큰 및 갱신 토큰으로 교환합니다.
  6. 백엔드 서버에서 응답이 Wear OS 호환 앱을 통해 제3자 시계 앱으로 이동하도록 리디렉션합니다.
  7. Wear OS 호환 앱이 리디렉션을 받은 다음, 웨어러블 지원 API onAuthorizationResponse()를 사용하여 서버의 전체 응답을 시계 앱으로 다시 보냅니다.
  8. 제3자 앱이 인증 사이트의 응답을 구문 분석하고 응답에서 인증 토큰을 추출합니다.
  9. 제3자 앱이 이후 요청에서 인증 토큰을 사용자 인증 정보로 사용합니다.

위의 인증 흐름을 구현하려면 다음 작업을 수행해야 합니다.

  1. 클라이언트 ID와 클라이언트 비밀번호를 만듭니다.
  2. 인증 요청을 수행합니다.
  3. 인증 응답을 처리합니다.

클라이언트 ID 및 클라이언트 비밀번호 만들기

OAuth 2.0을 사용하는 Wear 앱은 OAuth 제공자에게 애플리케이션을 식별하는 클라이언트 ID클라이언트 비밀번호를 만들어야 합니다. 이러한 사용자 인증 정보를 얻으려면 API 콘솔 프로젝트를 설정해야 합니다.

인증 요청 실행

OAuth 제공자에게 인증을 요청하려면 먼저 onCreate() 메서드에서 OAuth 2.0 요청에 사용할 클라이언트 객체를 만듭니다.

참고: 시계가 대기 모드로 전환될 때 앱이 종료되지 않도록 하려면 앱의 OAuth 활동에서 setAmbientEnabled를 통해 항상 사용 설정을 켭니다. 대기 모드의 권장사항에 관한 자세한 내용은 앱 표시 유지 페이지를 참조하세요.

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        oAuthClient = OAuthClient.create(this)
        …
    }
    

자바

    @Override
    public void onCreate(Bundle b) {
        super.onCreate(b);
        oAuthClient = OAuthClient.create(this);
        …
    }
    

토큰, 서버 OAuth 클라이언트 ID, 리디렉션 URL(백엔드 서버) 및 응답 유형을 가져오기 위해 OAuth 엔드포인트가 포함된 URL을 작성합니다.

요청된 URL은 다음과 유사합니다.

    https://accounts.google.com/o/oauth2/v2/auth?response_type=code
    &client_id="your_client_id_here";
    &scope=https://www.googleapis.com/auth/plus.login
    &redirect_uri=https://myserver.com
    

인증 요청을 작성한 후 Wear 서비스 API sendAuthorizationRequest()를 사용하여 호환 앱에 요청을 보낼 수 있습니다.

이 요청은 호환 앱에 관한 RPC를 트리거하여 사용자 휴대전화에 승인 UI를 표시합니다. OAuth 2.0 제공자는 사용자를 인증하고, 애플리케이션이 요청된 범위에 액세스할 수 있도록 사용자 동의를 얻습니다. 지정한 리디렉션 URL을 사용하여 응답이 백엔드 서버로 다시 전송됩니다.

인증 응답 처리

승인이 성공 또는 실패한 후 OAuth 2.0 서버가 요청에 지정된 URL로 리디렉션됩니다. 사용자가 액세스 요청을 승인하면 응답에 승인 코드가 포함됩니다. 사용자가 요청을 승인하지 않으면 응답에 오류 메시지가 포함됩니다.

응답은 아래와 같이 쿼리 문자열 형식입니다.

    https://myserver.com/oauthtokens?code=xyz
    

백엔드 서버는 승인 코드를 받은 후 승인 코드를 액세스 토큰으로 교환할 수 있습니다. 백엔드 서버는 다음 형식의 URL에서 수신자로 등록된 Wear OS 전화 앱에 HTTP 302 리디렉션을 반환합니다. https://wear.googleapis.com/3p_auth/app.html?full_suffix_from_redirect=com.your.package.name?accessToken=abc&refreshToken=xyz
전화 앱은 응답 URL을 확인하고, onAuthorizationResponse API를 사용하여 제3자 시계 앱에 응답을 릴레이합니다.

참고: 앱 패키지 이름이 리디렉션 URL의 세 번째 경로 구성요소인지 확인합니다. 따라서 redirect_urihttps://wear.googleapis.com/3p_auth/<receiving app's packagename>과(와) 같아야 합니다. 예를 들면 https://wear.googleapis.com/3p_auth/com.package.name입니다.

시계의 제3자 앱이 응답에서 인증 토큰을 추출하고, 이후 요청에서 인증 토큰을 사용자 인증 정보로 사용합니다.

Kotlin

    oAuthClient.sendAuthorizationRequest(Uri.parse(requestUrl), MyOAuthCallback())
    

자바

    // The callback provided will be called when the OAuth request completes.
    oAuthClient.sendAuthorizationRequest(Uri.parse(requestUrl), new MyOAuthCallback());
    

Kotlin

    private class MyOAuthCallback : OAuthClient.Callback() {

        override fun onAuthorizationResponse(requestUrl: Uri, responseUrl: Uri) {
            Runnable {
                acquireToken()
                accessAPI()
            }.apply {
                ...
            }
        }
    }
    

자바

    private class MyOAuthCallback extends OAuthClient.Callback {
        @Override
        public void onAuthorizationResponse(Uri requestUrl, Uri responseUrl) {
            Runnable r =
                new Runnable() {
                    public void run() {
                        acquireToken();
                        accessAPI();
                    }
                };
        }
    }
    

이 흐름의 전체 구현을 보려면 샘플을 참조하세요.

참고: 이 샘플에서는 시계가 토큰 교환을 처리합니다. 서버가 승인 코드 토큰 교환을 할 수 있는 자체 서버 URL로 리디렉션 URI를 설정하는 것이 좋습니다.

데이터 영역을 통한 토큰 전달

이 옵션은 Android와 페어링된 시계에서만 작동합니다. 휴대전화의 호환 앱은 웨어러블 데이터 영역을 통해 인증 데이터를 Wear 앱에 안전하게 전송할 수 있습니다. 사용자 인증 정보를 메시지 또는 데이터 항목으로 전송할 수 있습니다.

참고: 전화 APK와 시계 APK를 동일한 패키지 이름으로 제공하는 것이 좋습니다. 이렇게 하면 전화 앱과 Wear 앱이 DataItem 레이어를 통해 통신하고 백그라운드에서 휴대전화의 토큰을 시계로 전송하여 인증을 제공할 수 있습니다.

흐름

자체 비즈니스 로직을 사용하여 데이터 영역 API를 통해 사용자 인증 정보를 전달할 수 있습니다. 다음 다이어그램은 웨어러블 데이터 영역을 통해 토큰을 가져오는 방법 중 하나를 보여줍니다.

맞춤 코드 인증

이 인증 방식을 사용하려면 사용자가 외부 소스(휴대기기/태블릿/PC)에서 인증하고 수명이 짧은 코드를 얻은 다음, Wear 기기에서 이 코드를 입력하여 ID를 증명하고 인증 토큰으로 교환해야 합니다. 이 방식에서는 앱의 로그인 모듈을 사용하거나 제3자 인증 제공자 로그인 방식을 앱의 코드에 수동으로 통합하여 Wear 앱의 사용자를 인증할 수 있습니다. 이 인증 방식은 수동 작업과 추가 보안 조치가 필요하지만, 독립형 Wear 앱에서 초기 인증이 필요한 경우 이 방식을 사용할 수 있습니다.

이 설정의 인증 흐름은 다음과 같습니다.

  1. 사용자가 제3자 앱을 사용하여 승인이 필요한 작업을 실행합니다.
  2. 제3자 Wear 앱이 사용자에게 인증 화면을 표시하고, 사용자에게 지정된 URL의 코드를 입력하도록 지시합니다.
  3. 사용자가 휴대기기/태블릿 또는 PC로 전환하고 브라우저를 시작한 다음, Wear 앱에 지정된 URL로 이동하여 로그인합니다.
  4. 사용자가 수명이 짧은 코드를 받은 다음, Wear에 내장된 키보드를 통해 Wear 앱 인증 화면에 코드를 입력하여 인증받습니다.

  5. 이 시점부터 입력한 코드를 사용자 신원 증명으로 사용할 수 있으며, 이후의 인증된 호출을 위해 Wear 기기에 저장 및 보호되는 인증 토큰으로 교환할 수 있습니다.

다음 관련 리소스를 참조하세요.