none
javascript で access token をリフレッシュするには? RRS feed

  • 質問

  • ブラウザ上で動く javascript から、
    access token をリフレッシュするにはどうしたら良いのでしょう?



    下記サンプルコードを使っていろいろ試しています。

      LiveSDK / Samples / PHP / OauthSample
      http://goo.gl/0x0g4H

    一旦ログインした後にページを放っておくと、
    ログイン状態はそのまま保持されているようですが、
    3600s 後に access token は期限切れになります。

    リロードしてみると、下図の通り、
    Live API によるリクエスト (GET me) が失敗しています。


    エラーの原因は、
    以下の通り access token の期限切れのようです。

      code
        "request_token_expired"
      message
        "The access token that was provided has expired."


    サーバー上での access token のリフレッシュは下記の通り
    CLIENT_SECRET を付加した refresh_token を使った REST で可能のようですが、

      リフレッシュ トークンを使って
      新しいアクセス トークンとリフレッシュ トークンを取得する
      http://goo.gl/23Vz59

    javascript 内に CLIENT_SECRET を晒してはいけないでしょうから、
    どうやってリフレッシュすればいいのか分かりません。

    どなたかご存じないですか?


    • 編集済み custar 2014年2月12日 9:31
    2014年2月12日 9:26

すべての返信

  • 以下のように書かれているので、試してみました。


      Live Connect Developer Center > Docs > Core concepts > OAuth 2.0
      Authorization code grant flow
      http://goo.gl/1XOUc

    ...
    To refresh the access token,
    the client must make a request to the following URL.

    POST https://login.live.com/oauth20_token.srf

    Content-type: application/x-www-form-urlencoded

    client_id=CLIENT_ID
    &client_secret=CLIENT_SECRET
    &redirect_uri=REDIRECT_URI
    &grant_type=refresh_token
    &refresh_token=REFRESH_TOKEN

    To make things easier for developers of desktop and mobile apps,
    the Live Connect OAuth 2.0 implementation provides 
    the following special redirect URL:
    https://login.live.com/oauth20_desktop.srf.

    ...

    Because apps must also refresh access tokens,
    the Live Connect app management site allows apps to be marked as mobile client apps.

    When
      this marker is specified and
      the special redirect URL (https://login.live.com/oauth20_desktop.srf) is used, 
    the client secret is not required
    to refresh the access token.

    In that case,
    the URL for refreshing the access token looks like this.

    POST https://login.live.com/oauth20_token.srf ...................... (1)

    Content-type: application/x-www-form-urlencoded

    client_id=CLIENT_ID
    &redirect_uri=https://login.live.com/oauth20_desktop.srf
    &grant_type=refresh_token
    &refresh_token=REFRESH_TOKEN

    ログイン後、特に (1) を直接行っても、
    access token がリフレッシュされることはありませんでした。

    $.ajax({
    	type: "POST",
    	url: 'https://login.live.com/oauth20_token.srf',
    	dataType: 'json',
    	crossDomain: true,
    	data: {
    		client_id: client_id,
    		redirect_uri: 'https://login.live.com/oauth20_desktop.srf',
    		grant_type: 'refresh_token',
    		refresh_token: '...' ................................. (2)
    	},
    	success: function(data) {},
    	error: function(data) {}
    });

    My applications > ... > API Settings において、
    以下のように設定し、

      Mobile client app: [Yes]

    (2) は予め取得した値を流用しました。

    結果は

      400 Bad Request

    ...どうすればいいのでしょう?










    • 編集済み custar 2014年2月19日 12:33
    2014年2月19日 5:17
  • wl.debug.js (line:2356, v5.5.7410.3000) で
    WL.init の引数の説明の中に以下のように書かれています。

    refresh_type:
      Optional.
      Indicates the way on how to
        check user's login status and
        retrieve a new access token
      if the user already consented the scopes required by the app.

      Checking login status and
      retrieving a new access token happens in the following scenarios:

      i)
        The library is initialized via WL.init(...);
      ii)
        WL.getLoginStatus() is invoked;
      iii)
        Sign-in control is initiaized via WL.ui(....);
      iv)
        The access token is expired.

      If set to 'app',
      the library will send a request to the app server
      with address value specified in the redirect_uri parameter in WL.init(...).

      The app server should authenticate the user and
      retrieve the corresponding access token
      via the persisted refresh token of the user.

      If not specified,
      by default,
      the library will send a request to the OAuth server
      to perform
        login status checking and
        access token retrieving task.

      Note:
      to retrieve a new access token
      using default approach requires that
      i)
        the user must have already signed in with Microsoft account
        in the current web session and
      ii)
        the user must have already consented 'wl.signin' scope to the app.


    これらをどう使えと?

    • 編集済み custar 2014年2月19日 5:38
    2014年2月19日 5:36