OAuth,xAuthとOpenIDについて

  • 5,708 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,708
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
58
Comments
0
Likes
8

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. OAuth/xAuthとOpenID について第12回 OSS勉強会 2011/1/12 @kidooom
  • 2. 認証と認可の違い● 認証(Authentication) ● そのユーザーが自分の物であると主張するIDに対し て、そのIDが確かにそのユーザーの物であるということ を保証すること● 認可(Authorize) ● 認証されたIDを受け入れ、サービスに対して適切な権 限を与えること OpenIDは認証のための仕組み。認可は範囲外 OAuthは認証 + 認可のための仕組み。
  • 3. OAuthの概要● 認可情報の委譲のための仕様 ● あらかじめ信頼関係を構築したサービス間で ● ユーザ同意のもと、 ● セキュアにユーザの権限を受渡しする● 現在のOAuthの主流バージョンは1.0a であるた め、本資料も1.0aをベースに説明する
  • 4. OAuthの登場人物● User (⇔Open IDのUser Agentに相当) ● SP上にアカウントを持っているエンドユーザ● Consumer(⇔Open IDのRPに近い) ● User同意のもとSPの持つUserリソースへアクセスする Webサイトもしくはクライアントアプリケーション● SP (Service Provider) (⇔Open IDのOpen IDプロバイダ に近い) ● OAuth経由でUserリソースを提供するプロバイダ アカウントを所持 1. 事前に登録 Consumer SP 2. Userリソースへの   アクセスを許可 User User 3. User同意の上でアクセス リソース
  • 5. OAuthの重要用語● Consumer Key ● Consumerの識別子。SPが発行する● Consumer Secret ● Consumerを証明するための秘密鍵● Request Token ● ConsumerがUserリソースへアクセスする同意を得る ためのToken。Access Tokenと交換される。● Access Token ● ConsumerがUser同意のもと、SP上のリソースへアク セスする際に利用するToken。SP上のID/PASSの代わ りに使われる。
  • 6. 一般的なOAuthの使われ方 Consumer SPUser User リソース 1.メッセージ 2. oauth_callback や consumer keyなど Request Token URL 4. Spへのリダイレクト要求 + req-token (unauth) 3. req-token (unauth) 5. req-token (unauth) User Authorization URL 7. Consumer (oauth_callbackで指定したURL)へのリダイレクト要求 6. ユーザ認証 + req_token (authed) + アクセス認可 8. req-token (authed) 9. req-token(authed) + consumer key + nonceなど Access Token URL 10. req-tokenと 11. access-token Access-token Consumerは内部でaccess-tokenを保持。 を交換 12. access-token + API呼び出し 13. result 14. result
  • 7. Request URLs● OAuthでは3つのRequest URLを定義している ● Request Token URL – ConsumerがまだUserに認可されていない(unauth) Request Tokenを取得するために使われる ● User Authrization URL – Consumer が未認可のRequest TokenをUserに認可させる ために使われる ● Access Token URL – Userが認可したRequest TokenをAccess Tokenと交換する ために使われる。
  • 8. Consumer Request Parameter● Oauthプロトコルのパラメータは、次の3つのいず れかの方式でConsumerからSPに対して送信され る。 ● HTTPヘッダの「Authrization」に記述 ● HTTP POST Request の bodyに「content-type of application/x-www-form-urlencoded.」として送信 ● URLのクエリ部分に追加して送信する
  • 9. Authorization Header● Oauthプロトコルパラメータは、以下のような Authorization Headerで送信される。 例: Authorization: Oauth realm = “http://sp.example.com/”, oauth_consumer_key=”05431bdf438743”, oauth_token=”ad8384834adad893”, oauth_signature_method=”HMAC-SHA1”, oauth_signature=”wOKsojids90dasjjiFjsijdsjS2”, oauth_timestamp=”137131200”, oauth_nonce=”47284378e89343829e929329”, oauth_version=”1.0”
  • 10. Nonceとタイムスタンプ● Consumerは、すべてのrequestとその署名に対し てNonceを生成するべき(SHALL)。 ● Nonceはランダムな文字列で、それぞれのrequestに対 してユニークになるように生成する。 ● Nonceにより、SPはリプレイアタックを防止する。● タイムスタンプの値は必ず正の整数である必要が あり(MUST)、それ以前のrequestのタイムスタン プと同じ、または大きな値である必要がある (MUST).
  • 11. Requestの署名● Consumerは、すべてのToken Request、保護され たリソースへのrequestに署名をつけ、Service Providerにその署名が正しいかを確認してもらう必 要がある(MUST)● 個々の状況により署名方式は変わる場合があるた め、OAuthでは特定の署名方式までは定義ない。 ● プロトコルではHMAC-SHA1、RSA- SHA1、プレーンテ キストの3つの署名方式を定義しているが、SPは固有 の署名方式で実装することができる。
  • 12. OAuthでできないこと● Oauthはリダイレクト処理がシーケンスに含まれて いる ⇒ Webブラウザ前提の仕組み ⇒ デスクトップクライアントなど非ブラウザのクライアン トから利用できない!そこでお悩みの人にxAuthという仕組みがある
  • 13. xAuthの概要● xAuthはデスクトップソフトなど非ブラウザのクライ アントのための仕組み ● 従来、非ブラウザのクライアントからはBasic認証でAPI の呼びだしのたびにユーザ名・パスワードを送信する方 法を用いていた。しかしセキュリティ上問題があるため Basic認証を禁止する動きが広まり、代わりにxAuthが 使われるようになった。
  • 14. xAuthの特徴● UserがConsumerを信頼しているという前提のもと 用いる● ConsumerはUserから認証情報を一度取得する必 要がある。 ● OAuthの利点の1つであるUserがConsumerにパス ワードを預けなくても良いという点は失われる。● Userの認証情報を用いてSPからAccess Tokenを 取得する。 ● 一度Acccess Tokenを取得してしまえばそれ以降認証 情報は利用しない。 ● 毎回パスワードを垂れ流すBasic認証よりはセキュア
  • 15. 一般的なxAuthの使われ方 Consumer SPUser 一度認証情報を User Consumerに渡す リソース 2. xauth_username や 1.メッセージ + 認証情報 xauth_password, consumer keyなど 3. ユーザ認証 + アクセス認可 4. access-token Consumerは内部でaccess-tokenを保持。 必要に応じてaccess-tokenを使って SPのAPIを実行すると、 Userリソースにアクセスできる。 5. access-token + API呼びだし 6. result 7. result
  • 16. OAuth/xAuthとOpenIDの使い分け● 「Webサービスを立ち上げたい!自分たちでユーザ管理をした い!」 ⇒ 頑張ってユーザ管理機能を実装しましょう。将来的にSPとして OpenIDまたはOAuthで外部サービスにユーザ情報を提供することも 考えましょう。● 「Webサービスを立ち上げたいが自分たちでユーザ管理はしたくな い!」 ⇒ OpenIDまたはOAuth/xAuthを使えば楽かも。 ● 「とりあえずユーザ認証だけできればいい!」 – ⇒OpenIDを使おう ● 「ユーザ認証だけでなく、TwitterやfacebookなどのSP上のUserリソー スを利用したい!」 – Oauth/xAuthを使おう。ブラウザ前提ならばOAuth, 非ブラウザならばxAuthを採 用しよう。
  • 17. OAuthを使ったTwitter botの作成● GAE/J (Google App Engine for Java) 上で OAuthを使ってTwitter botを作成 ● ライブラリはTwitter4jを利用 ● 用意した発言リストの中から定期的にランダムに発言 するだけのbot
  • 18. Access Tokenの取得プログラム 1/3● getAccessToken.htmlを用意<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Get AccessToken</title> </head> <body> <form method="POST" action="/getaccesstoken">bot name: <input id="name" type="text" name="name" /><br /> <input type="submit" value="post" /> </form> </body></html>
  • 19. Access Tokenの取得プログラム 2/3● getAccessToken.htmlでUserからPOSTを受 け、SPからRequest Tokenを取得。Userをアプリ ケーション認可画面へリダイレクト。 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { try { // getAccessToken.htmlで入力した「bot name」をセッションに格納 String botname = req.getParameter("name"); req.getSession().setAttribute("botname", botname); // twitterオブジェクトをセッションに格納 Twitter twitter = new TwitterFactory().getInstance(); req.getSession().setAttribute("twitter", twitter); // callback用のURLを生成して格納 StringBuffer callbackURL = req.getRequestURL(); int index = callbackURL.lastIndexOf("/"); callbackURL.replace(index, callbackURL.length(), "").append( "/callback"); // RequestTokenを取得してセッションに格納、アプリケーション認可画面に移動 RequestToken requestToken = twitter .getOAuthRequestToken(callbackURL.toString()); req.getSession().setAttribute("requestToken", requestToken); resp.sendRedirect(requestToken.getAuthenticationURL());
  • 20. 前スライドのシーケンス Consumer SPUser User リソース 1.メッセージ 2. oauth_callback や consumer keyなど Request Token URL 4. Spへのリダイレクト要求 + req-token (unauth) 3. req-token (unauth) 5. req-token (unauth) User Authorization URL 7. Consumer (oauth_callbackで指定したURL)へのリダイレクト要求 6. ユーザ認証 + req_token (authed) + アクセス認可 8. req-token (authed) 9. req-token(authed) + consumer key + nonceなど Access Token URL 10. req-tokenと Access-token を交換 11. access-token 12. result Consumerは内部でaccess-tokenを保持。 必要に応じてaccess-tokenを使って SPのAPIを実行すると、 Userリソースにアクセスできる。
  • 21. 認証/認可画面へのリダイレクト
  • 22. Access Tokenの取得プログラム 3/3● Userから認証済みのRequest Tokenを受け取り、 SPに送信してAccess Tokenを取得する。 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // セッションからtwitterオブジェクトとRequestTokenの取出 AccessToken accessToken = null; Twitter twitter = (Twitter) req.getSession().getAttribute("twitter"); RequestToken requestToken = (RequestToken) req.getSession() .getAttribute("requestToken"); String verifier = req.getParameter("oauth_verifier"); // AccessTokenの取得 try { accessToken = twitter.getOAuthAccessToken(requestToken, verifier); req.getSession().removeAttribute("requestToken"); } catch (TwitterException e) { log.info(e.getMessage()); } // TokenオブジェクトにAccessToken/Secretと「bot name」を格納しGAE上に保存 if (accessToken != null) { PersistenceManager pm = PMF.get().getPersistenceManager(); Token token = new Token(); token.setAccessToken(accessToken.getToken()); token.setAccessSecret(accessToken.getTokenSecret()); token.setBotName((String) req.getSession().getAttribute("botname")); pm.makePersistent(token); pm.close(); } req.getSession().removeAttribute("botname"); resp.sendRedirect(req.getContextPath() + "/");
  • 23. 前スライドのシーケンス Consumer SPUser User リソース 1.メッセージ 2. oauth_callback や consumer keyなど Request Token URL 4. Spへのリダイレクト要求 + req-token (unauth) 3. req-token (unauth) 5. req-token (unauth) User Authorization URL 7. Consumer (oauth_callbackで指定したURL)へのリダイレクト要求 6. ユーザ認証 + req_token (authed) + アクセス認可 8. req-token (authed) 9. req-token(authed) + consumer key + nonceなど Access Token URL 10. req-tokenと Access-token を交換 11. access-token 12. result Consumerは内部でaccess-tokenを保持。 必要に応じてaccess-tokenを使って SPのAPIを実行すると、 Userリソースにアクセスできる。
  • 24. 作成したTwitter botこのbotプログラムはAccess Tokenだけを使って自動的につぶやいている(一度もこのTwitterアカウントのUserID/Passwordを渡していない) botのアプリケーション名が表示されてます