ã2017幎4æ20æ¥ãããçµã¿èŸŒã¿ãã©ãŠã¶ããã®èªèšŒãªã¯ãšã¹ãã®éä¿¡ã¯ãããã¯ãããŸããã3æ1æ¥ããã®ãã®ãããªã¡ãã»ãŒãžã¯ãæ¿èªãå¿ èŠãªäžéšã®ã¢ããªã±ãŒã·ã§ã³ã§èŠãããšãã§ããŸãã Googleã¯2016幎8æã«åœŒã®ããã°ã§ãã®ããšãæžããŸãããããã¯ãããã«å€ãã®ã¢ããªã±ãŒã·ã§ã³ãç»é²ã®å®è£ ãæžãæããå¿ èŠãããããšãæå³ããŸãã ããŸãå¿«é©ã§ã¯ãããŸãããã解決çããããŸã-æšå¥šãããGoogleãµã€ã³ã€ã³èªèšŒæ¹æ³ã䜿çšããŠãã ããã
ãã®ã¡ãœããã«ã€ããŠã¯ãã¬ãã¹ã³ã§èª¬æããã»ããGoogle APIã®æäœã«å¿ èŠãªããŒã¯ã³ãååŸããæ¹æ³ã«ã€ããŠã説æããŸãã
ã¬ãã¹ã³ã«ã¯ãå ¬åŒææžã®éšåçãªç¿»èš³ãå«ãŸããŸãã ããããæåã«ãç§ã®å®è·µããã®å°ãã®èæ¯ãšOAuth2ã§ã®æåã®äœæ¥ã¯ããããã誰ããåæ§ã®ç¶æ³ã«ããã§ãããã
ã¢ããªã±ãŒã·ã§ã³ãYouTubeã©ã€ããããŒããã£ã¹ããããã£ãããååŸããå¿ èŠããããŸããã ãããŠããããŒããã£ã¹ããªã¯ãšã¹ããéä¿¡ããã«ã¯ïŒãã£ããã®åŸã§ã®ã¿ïŒOAuth2ã§ãŠãŒã¶ãŒãèªèšŒããå¿ èŠãããããšãããããŸããã æ€çŽ¢ãå§ããŸããã ãã®ãããã¯ã«é¢ããæ å ±ã¯éåžžã«å°ãããã°ãã°ãã§ãããç§ã®å Žåã«ã¯é©ããŠãããããã¡ãããã¹ãŠãè±èªã§æžãããŠããŸããã ã»ãšãã©ã®æ å ±ã¯ãæã人æ°ã®ããAPIã§ããDriveãCloudãGoogle Plusãšé£æºããããã®ãã®ã§ããã å ¬åŒã®YouTube APIããã¥ã¡ã³ãã«ã¯æ¢è£œã®ã³ãŒããããããããåãåã£ãŠäœ¿çšããŸãããAndroidã§ã¯æ©èœããŸããã è©Šè¡é¯èª€ãç¹°ãè¿ããŠãããªãã®æéãè²»ãããŠãå®çšçãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããŸããã ãã®åŸãç§ãæåã«ããããããšã¯ãæ å ±ããããŒãå ãã«åéããŠæ£ã«çœ®ãããšã§ãããããã«ããããã®ã¬ãã¹ã³ãæžãããã«ãªããŸããã
æåã«ãç§ã®æ±ºå®ã¯ããŠãŒã¶ãŒãèªèšŒïŒé»åã¡ãŒã«ããã¹ã¯ãŒããå ¥åïŒããããã«WebViewãéããããšããäºå®ããå§ãŸããŸããã 次ã«ãããŒã¿ã䜿çšããããã®èš±å¯ãèŠæ±ãããèš±å¯åŸã«èªèšŒã³ãŒãïŒAuthCodeïŒãå¿çã«å«ãŸããŸããããã«ã€ããŠã¯ãåŸã§ãããã©ãåŠçãããã«ã€ããŠèª¬æããŸãã WebViewã§éããURLã¯æ¬¡ã®ãšããã§ãã
https://accounts.google.com/o/oauth2/auth? client_id=60*********5ad3np.apps.googleusercontent.com &redirect_uri=urn:ietf:wg:oauth:2.0:oob &access_type=offline&response_type=code &scope=https://www.googleapis.com/auth/youtube.readonly
ããã¯ãããŒãžããããŒã«ããã³ãŒãã§ããauthCodeãå«ãããŒãžãžã®å¿çãšããŠã®æçš¿èŠæ±ã«ãããŸããã APIãžã®æšå¥šäºé ãšããŠãŒã¶ãŒãããã®ã³ãŒããé衚瀺ã«ããã¢ã¯ã·ã§ã³ã«åŸã£ãŠããã¹ãŠãéçºè ã«ä»»ãããŸããã
ãã¹ãŠãæ£åžžã«æ©èœããã¢ããªã±ãŒã·ã§ã³ã¯å ¬éãããŸããããããæ¥ç§ã¯ä»¥äžãèŠãŸããïŒ
![](https://habrastorage.org/files/465/8f5/b5f/4658f5b5f1994b669673dee12cbb154e.jpg)
ã詳现ããªã³ã¯ãã¯ãªãã¯ãããšãããã°ã«ã¢ã¯ã»ã¹ããŸãããããã§ã¯ã»ãã¥ãªãã£ã®åã®äžã«ãWebViewã«ããèªèšŒã¯4æ20æ¥ä»¥éæ©èœããªããšæžãããŠããŸãã ãŸããç§ã¯ããããã£ãã°ããã§ããµã€ã³ã€ã³ã§ããçŽãå¿ èŠããããšæããŸãã ãããŠæåã¯ããã®ãµãŒãã¹ãéããŠå®è£ ãè©Šã¿ãŸããã ãããããäœãšãªãããšããæ¢åã®ç¥èãããã°ãããã«å€æããŸããã ããã§ã¯ãå§ããŸãããã
1.è³æ Œæ å ±ã®ååŸ
API Managerã§ãæ°ãããããžã§ã¯ããäœæããŸãïŒãŸãã¯æ¢åã®ãããžã§ã¯ããéžæããŸãïŒã
![](https://habrastorage.org/files/3d3/4e1/4a6/3d34e14a688e4559a6c7f38ec51dab63.jpg)
æ¿èªã®ããã«ããŠã£ã¶ãŒãã§ååŸã§ããæ§æãã¡ã€ã«ãå¿ èŠã«ãªããŸãã
![](https://habrastorage.org/files/7c2/f88/703/7c2f8870335544e99ca6cf1bc35559be.jpg)
ã¢ããªã±ãŒã·ã§ã³åãšããã±ãŒãžã®ãã£ãŒã«ãã«å ¥åããŸãã 次ã«ãæ¥ç¶ãããµãŒãã¹ïŒGoogleãµã€ã³ã€ã³ïŒãéžæããŸããããã§ãã¢ããªã±ãŒã·ã§ã³ã®SHA1ããŒãå ¥åããå¿ èŠããããŸããååŸã¯ç°¡åã§ããAndroidStudioã§[Gradle]ã¿ããèŠã€ãã[Tasks-android-signingReport]ã¿ããéããŸãã ããã«ã¯ãªãã¯ãããšãããŒã«é¢ããæ å ±ããã°ã«è¡šç€ºãããŸãã ããŒSHA1ãã³ããŒãèŠã€ããŸãã
![](https://habrastorage.org/files/231/551/1e6/2315511e6671456580b3a55447b0782a.jpg)
![](https://habrastorage.org/files/f65/a43/29a/f65a4329a53b44359410676f3d95a10e.jpg)
[æ§æãã¡ã€ã«ãçæ]ãã¿ã³ãã¯ãªãã¯ãã[google-services.jsonãããŠã³ããŒã]ãã¯ãªãã¯ããŸãã ãã®jsonãã¡ã€ã«ã¯ããããžã§ã¯ããã©ã«ããŒãappãã«ä¿åãããŸãã
éèŠïŒ Google Playã§ã¢ããªã±ãŒã·ã§ã³ãå ¬éããå Žåããããã°ããŒSHA1ããããããªãªãŒã¹ããŒã«çœ®ãæããæ§æãã¡ã€ã«ã眮ãæããå¿ èŠããããŸãã
APIãããŒãžã£ãŒã«ç§»åãããšãããŒãšOAuthã¯ã©ã€ã¢ã³ãèå¥åãçæãããããšãããããŸãã Webã¯ã©ã€ã¢ã³ãããŒã¿ïŒã¯ã©ã€ã¢ã³ãèå¥åãšã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããïŒã®ã¿ãå¿ èŠã§ãã
![](https://habrastorage.org/files/3bc/c80/b26/3bcc80b26c5e481c9e70c6f33c43f82d.jpg)
ãOAuthã¢ã¯ã»ã¹èŠæ±ãŠã£ã³ããŠãã¿ãã§ãã¡ãŒã«ãšè£œååãå€æŽã§ããŸããããã¯ãèš±å¯ãèŠæ±ããããšãã«æžã蟌ãŸããå 容ã§ããApplication **** asksïŒ...ã
2.ã¯ã©ã€ã¢ã³ããµã€ã³ã€ã³ã®æ§æ
Google Api Clientã«ã¢ã¯ã»ã¹ããã«ã¯ã以äžã«å¿ããŠgradleã¢ããªãã¡ã€ã«ã«è¿œå ããŸãã
compile 'com.google.android.gms:play-services-auth:10.2.0'
ãããŠããã©ã°ã€ã³ïŒãã¡ã€ã«ã®æåŸïŒïŒ
apply plugin: 'com.google.gms.google-services'
äŸåããgradleãããžã§ã¯ããã¡ã€ã«ïŒ
classpath 'com.google.gms:google-services:3.0.0'
ãªãã·ã§ã³ãæ§æããŸãã
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestServerAuthCode(getString(R.string.server_client_id)) .requestEmail() .requestScopes(new Scope("https://www.googleapis.com/auth/youtube.readonly")) .build();
ããã§æãéèŠãªè¡ã¯æ¬¡ã®ãšããã§ãã
requestServerAuthCode(getString(R.string.server_client_id))
-authCodeãèŠæ±ããäžèšã§åãåã£ãã¯ã©ã€ã¢ã³ãèå¥åãã©ã¡ãŒã¿ãŒïŒãã¹ãŠå®å šã«ïŒãæž¡ããŸãã
requestScopes(new Scope("***"))
-䜿çšããAPIã«å¿ èŠãªã¢ã¯ã»ã¹é åãèŠæ±ããŸãã ã¹ã³ãŒãã«ã¯æ¢ã«å®çŸ©æžã¿ã®é åãããã€ããããŸãããé©åãªé åãèŠã€ãããªãå Žåã¯ãç§ã®å Žåã®ããã«ç¬èªã®é åãèšå®ã§ããŸãã ãŠãŒã¶ãŒã«ãšã£ãŠã¯ãã¢ããªã±ãŒã·ã§ã³ãååŸããããã®ãžã®ã¢ã¯ã»ã¹ãšããŠè¡šç€ºãããŸãã
ã¯ã©ã€ã¢ã³ããæ§æããŸãã
GoogleApiClient mApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build();
ãã¹ãŠãããã¥ã¡ã³ãã®æšæºã«æºæ ããŠããŸãã
enableAutoManage(this, this)
-ã¢ã¯ãã£ããã£ãšæ¥ç¶ãªã¹ããŒããã©ã¡ãŒã¿ãŒã«æž¡ãããŸãïŒGoogleApiClient.OnConnectionFailedListenerã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŸãïŒã
addApi(Auth.GOOGLE_SIGN_IN_API, gso)
-ãµã€ã³ã€ã³APIãšä»¥åã«äœæããããªãã·ã§ã³ãªããžã§ã¯ãã䜿çšããããšã瀺ããŸãã
æ¿èªãéå§ããã«ã¯ããã¿ã³ïŒãŸãã¯ãã®ä»ã®èŠçŽ ïŒãå¿ èŠã§ãã æšæºã®ãµã€ã³ã€ã³ãã¿ã³ã䜿çšã§ããŸãã XMLããŒã¯ã¢ããïŒ
<com.google.android.gms.common.SignInButton android:id="@+id/activity_button_sign_in" android:layout_width="wrap_content" android:layout_height="wrap_content" />
次ã®ããã«ãªããŸãã
![](https://habrastorage.org/files/1e6/509/e38/1e6509e3861f46edaa08510a1ad5a99a.jpg)
ã¢ã¯ãã£ããã£ã§ã¯ããã¿ã³ã¯ä»ã®ãã¹ãŠã®ãã¥ãŒãšåãããã«å®çŸ©ãããŸãããªã¹ããŒããã³ã°ããããã¿ã³ãã¯ãªãã¯ããŠã¡ãœãããå®è¡ããŸãã
@Override public void onClick(View view) { switch (view.getId()) { case R.id.activity_button_sign_in: signIn(); break; } }
åŒã³åºãããã¡ãœããã®ã³ãŒãã¯ãã€ã³ãã³ãã®äœæãšæ¿èªã®ããã®ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒã«ã§ãã
public void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mApiClient); startActivityForResult(signInIntent, RC_AUTH_CODE); }
æ§æãããmApiClientããã©ã¡ãŒã¿ãŒã«æž¡ããŸãã ãã€ãã®ããã«ãã¢ã¯ãã£ããã£ã®çµæã远跡ããããã®ä»»æã®çªå·ã®RC_AUTH_CODEã
ãã¿ã³ãã¯ãªãã¯ãããšããã°ã€ã³ããã¢ã«ãŠã³ããéžæããããæ°ããã¢ã«ãŠã³ããè¿œå ããããæ±ããããŸãã éžæåŸãã¢ããªã±ãŒã·ã§ã³ã¯èš±å¯ãèŠæ±ããŸãã
![](https://habrastorage.org/files/806/185/fc1/806185fc18ee4b2b87f07de434fbfece.jpg)
3.èªèšŒã³ãŒãã®ååŸ
ãŠãŒã¶ãŒãèš±å¯ãäžããåŸãonActivityResultã§ã¢ã«ãŠã³ãããŒã¿ãååŸããŸãã
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RC_AUTH_CODE) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { GoogleSignInAccount acct = result.getSignInAccount(); String authCode = acct.getServerAuthCode(); getAccessToken(authCode); } } }
ãã®çµæãéåžžã®è¡ãšããŠèªèšŒã³ãŒããååŸããŸãã次ã®ããã«ãªããŸãã
4/iHhVmqtxccXh0Qs*********oo5XG8OjaNsWu_kEKyw
ãŸããã¢ã«ãŠã³ããããŠãŒã¶ãŒã®ã¡ãŒã«ããŠãŒã¶ãŒåãã¢ãã¿ãŒãååŸã§ããŸãïŒ
acct.getEmailïŒïŒ
acct.getDisplayNameïŒïŒ
acct.getPhotoUrlïŒïŒ
ãã®ããŒã¿ã¯ãããšãã°ãããããŒNavigationViewã«æ¿å ¥ããããã«å¿ èŠã«ãªãå ŽåããããŸãã
4.ã¢ã¯ã»ã¹ããŒã¯ã³ãšãªãã¬ãã·ã¥ããŒã¯ã³ã®ååŸ
èªèšŒã³ãŒããååŸããŸãããAPIãªã¯ãšã¹ãã«å¿ èŠãªããŒã¯ã³ã«å€æŽããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã
https://www.googleapis.com/oauth2/v4/token.
ãªã¯ãšã¹ããäœæã
https://www.googleapis.com/oauth2/v4/token.
ããšãã°ãOkHttpã䜿çšããŠãããè¡ããŸãã
public void getAccessToken(String authCode) { OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new FormEncodingBuilder() .add("grant_type", "authorization_code") .add("client_id", getString(R.string.server_client_id)) .add("client_secret", getString(R.string.client_secret)) .add("code", authCode) .build(); final Request request = new Request.Builder() .url("https://www.googleapis.com/oauth2/v4/token") .header("Content-Type", "application/x-www-form-urlencoded") .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) {} @Override public void onResponse(Response response) throws IOException { try { JSONObject jsonObject = new JSONObject(response.body().string()); mAccessToken = jsonObject.get("access_token").toString(); mTokenType = jsonObject.get("token_type").toString(); mRefreshToken = jsonObject.get("refresh_token").toString(); } catch (JSONException e) { e.printStackTrace(); } } }); }
ãã©ã¡ãŒã¿ãŒããã詳现ã«æ€èšããŠãã ããã Request.BuilderïŒïŒã§ãããŒã¯ã³ãååŸããURLãæž¡ããŸãã
url("https://www.googleapis.com/oauth2/v4/token")
ããããŒã§ãContent-Typeãæå®ããŸãã
header("Content-Type", "application/x-www-form-urlencoded")
ãããPOSTã¡ãœããã§ããããšã瀺ããbodyãæž¡ããŸãïŒ
post(requestBody)
çæãããrequestBodyã«ã¯ããã©ã¡ãŒã¿ãŒãå«ãŸããŠããå¿ èŠããããŸãã
"grant_type", "authorization_code"
-èªèšŒã³ãŒããæž¡ãããšã瀺ããŸã
"client_id", getString(R.string.server_client_id)
-ãã©ã¡ãŒã¿ãŒã¯ãAPI Managerã§åä¿¡ããã¯ã©ã€ã¢ã³ãIDã§ã
"client_secret", getString(R.string.client_secret)
Managerã§åä¿¡ããã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ãã
"code", authCode
å®éã«åãåã£ãã³ãŒãã
ãªã¯ãšã¹ãã¯éåæã§ãã¬ã¹ãã³ã¹ã§ã¯ãåäœã«å¿ èŠãªãã¹ãŠã®ããŒã¿ãå«ãéåžžã®jsonãååŸããŸãã
{ "access_token":"ya29.GlsfBJNMTfGyâŠ", "token_type":"Bearer", "expires_in":3600, "refresh_token":"1\/72OqA7zYuyY__XhGij5oA2nEb7âŠ", "id_token":"eyJhbGciOiJSUzI1NiIsImtpZâŠ" }
"access_token"
-ãã¹ãŠãä¿æãããã¢ã¯ã»ã¹ããŒã¯ã³
"expires_in"
-ã¢ã¯ã»ã¹ããŒã¯ã³ã®æå¹æéãããã©ã«ãã§ã¯ãããŒã¯ã³ã¯1æéåç¶ããŸãããªã¯ãšã¹ãã«å¿ããŠ1æ¥ã«25åã®ããŒã¯ã³ãåãåãããšãã§ããŸãã
"token_type"
-ããŒã¯ã³ã®ã¿ã€ãããããèŠããŠããå¿ èŠããããŸãããŸããå°æ¥ã®APIã®ãªã¯ãšã¹ãã«ãæ¿å ¥ãããŸãã
"refresh_token"
ã¯ã1æéãçµéãããšãã«ã¢ã¯ã»ã¹ããŒã¯ã³ãæŽæ°ããããã®ããŒã¯ã³ã§ãã æŽæ°ããŒã¯ã³ã¯å€æŽãããŠããŸããã å€ãã®å Žåããã©ãŒã©ã ã§ç§èªèº«ãééããåé¡ãèŠãŸããããã®ããŒã¯ã³ã¯ãªã¯ãšã¹ãã«å«ãŸããŠããŸããã§ããã ãšã©ãŒã¯ãäžæ£ãªè³æ Œæ å ±ãŸãã¯äžæ£ãªèŠæ±ã§æ§æãããŠããŸãã èš±å¯ãWebViewãä»ããŠå®è¡ãããurlã§access_type = offlineãªã©ã®éèŠãªãã©ã¡ãŒã¿ãŒã瀺ãããŠããªãã£ãå ŽåãæŽæ°ããŒã¯ã³ã¯éä¿¡ãããŸããã§ããã
5.ã¢ã¯ã»ã¹ããŒã¯ã³ã®æŽæ°
1æéãçµéããã¢ã¯ã»ã¹ããŒã¯ã³ãã¢ã¯ãã£ãã§ãªããªã£ããããæ°ããããŒã¯ã³ãå¿ èŠã§ãã ãšã©ãŒ401ãŸãã¯403ãçºçãããšããµãŒããŒã¯ãŠãŒã¶ãŒãèªèšŒãããŠããªãããã¢ã¯ã»ã¹æš©ããªããšèšããŸãã ããšãã°ãç§ã®ãããªç¶ç¶çãªã»ãã·ã§ã³ãå¿ èŠãªå ŽåããããŒããã£ã¹ãäžã«ãã£ããããã¡ãã»ãŒãžãç¶ç¶çã«åä¿¡ããå¿ èŠãããå Žåãæ°ããèš±å¯ããªã¯ãšã¹ãããã®ã¯è¯ããããŸãããããã¯æ°æéã§ãã ã©ããã æ°ããããŒã¯ã³ã®ãªã¯ãšã¹ããéä¿¡ããŸãã
ãªã¯ãšã¹ãã¯åºæ¬çã«ãã©ã°ã©ã4ãšåãã§ãããããã€ãã®ãã©ã¡ãŒã¿ãç°ãªããŸãã
private void getNewAccessToken() { OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new FormEncodingBuilder() .add("refresh_token", mRefreshToken) .add("client_id", getString(R.string.server_client_id)) .add("client_secret", getString(R.string.client_secret)) .add("grant_type", "refresh_token") .build(); final Request request = new Request.Builder() .url("https://www.googleapis.com/oauth2/v4/token") .header("Content-Type", "application/x-www-form-urlencoded") .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) {} @Override public void onResponse(Response response) throws IOException { try { JSONObject jsonObject = new JSONObject(response.body().string()); mAccessToken = jsonObject.get("access_token").toString(); } catch (JSONException e) { e.printStackTrace(); } } }); }
éèŠãªãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ãã
"grant_type", "refresh_token"
-ã¿ã€ãã§ãªãã¬ãã·ã¥ããŒã¯ã³ãéä¿¡ããŠããããšã瀺ã
"refresh_token", mRefreshToken
ããã³ããŒã¯ã³èªäœ
å¿çã¯ãæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãå«ãjsonã«ãªããŸããããã«ã¯ãAPIããåã³ã¢ã¯ã»ã¹ã§ããŸãã
{ "access_token":"ya29.GlsfBM7Y...", "token_type":"Bearer", "expires_in":3600, "id_token":"eyJhbGciOiJ..." }
ãã®æ¿èªã§ããŠãŒã¶ãŒèªèšŒãå®äºããŸãã
ããšãã°ãAPIãžã®ãªã¯ãšã¹ããã©ã®ããã«èŠããããããŒã¯ã³ãæŽæ°ããæ¹æ³ã瀺ããŸãã
APIããªã¯ãšã¹ãããã«ã¯ãRetrofit2 + RxAndroidã䜿çšããŸãã ã©ã€ããã£ãããã£ãããåä¿¡ãããªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
@GET(GoogleApiUrls.Youtube.CHAT) Observable<ChatResponse> getChat(@Header("Authorization") String token, @Query("liveChatId") String liveChatId, @Query("part") String part);
ããã§éèŠãªã®ã¯ãèªèšŒããŒã䜿çšããŠãããŒã¯ã³ã®ã¿ã€ããšã¢ã¯ã»ã¹ããŒã¯ã³èªäœãããããŒã§éä¿¡ããå¿ èŠãããããšã§ãã ã€ãŸãããã®ããã«ïŒ
Authorization Bearer ya29.GlsfBJNMTfGyâŠ
次ã«ãRxAndroidãä»ããŠãªã¯ãšã¹ããè¡ããŸãããã¹ãŠã®çš®é¡ã®ãšã©ãŒãonErrorã³ãŒã«ããã¯ã«éãããããã1æéåŸã«401 Unauthorizedã³ãŒãã䌎ãHttpExceptionãšã©ãŒãçºçããŸãã ããã§åŠçãããããåããšã©ãŒã§ãããã©ããã確èªããé©åãªã¿ã€ãã«å€æããå®éã«401ã³ãŒããã©ããã確èªããæ°ããããŒã¯ã³ãååŸããã¡ãœãããå®è¡ããŠããªã¯ãšã¹ããç¹°ãè¿ããŸãã
@Override public void onError(Throwable e) { if (e instanceof HttpException) { HttpException exception = (HttpException) e; if (exception.code() == 401) { getNewAccessToken(); } } }
ããŒã¯ã³ã確èªããããã®GETãªã¯ãšã¹ãããããŸãã
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=ya29.GlsfBJNMTfGyâŠ
å¿çã«ã¯ãããŒã¯ã³ããŸã ã¢ã¯ãã£ããªå Žåã¯ããŒã¯ã³ã«é¢ããããŒã¿ãå«ãŸããæå¹æéãåããŠããå Žåã¯ãšã©ãŒãå«ãŸããŸãã
ç¹°ãè¿ãã«ãªããŸãããGoogleã«ããããŒã¯ã³æŽæ°ã®å®è£ ã¯éçºè ã«ä»»ãããŠããŸãã
ãã°ã¢ãŠãããŠæ¿èªãåãæ¶ãã®ã¯ç°¡åã§ããå¿ èŠã«å¿ããŠå ¬åŒã®ããã¥ã¡ã³ããèŠã€ããããšã¯é£ãããããŸããã
äœæ¥ãéå§ããåã«ãPostmanãªã©ã®ãµãŒãããŒãã£ã®ã¢ããªã±ãŒã·ã§ã³/æ¡åŒµæ©èœã§ãªã¯ãšã¹ãããã§ãã¯ããŠããã©ã¡ãŒã¿ãæ£ããå ¥åãããåçãåä¿¡ãããããšã確èªããããšããå§ãããŸãã 誰ãããã®ã¬ãã¹ã³ã圹ã«ç«ã€ãšæã£ãããšãŠãããããã§ãïŒ
䜿çšãããŠããããã¥ã¡ã³ããžã®ãªã³ã¯ïŒ
1. AndroidåãGoogleãµã€ã³ã€ã³
2. Youtube APIã OAuth 2.0ãããŒ