Open7

OAuthによる認証(GitHub連携)

ふじしろふじしろ

活用するメソッドなど

ふじしろふじしろ

画面の流れ

  1. TOP画面
  2. (ログインボタン等クリック)
  3. OAuth認証画面
  4. (「認証」クリック or ログイン処理)
  5. ログイン後の画面

処理の流れ(URLは一例)

  1. TOP画面(/
  2. ログイン処理(/login
  3. GItHub認証画面(https://github.com/login/oauth/authorize?client_id=<Client ID>)
  4. (認証)
  5. Callback処理画面(/callback?code=<code>)※
  6. アクセストークン取得処理(https://github.com/login/oauth/access_token?code=<code>&client_id=<Client ID>&client_secret=<Client Secret>
  7. アクセストークンから認証情報取得処理
  8. ログイン後の画面(/main

/callbackは、GitHubでOAuthアプリ作成を行なった際に<Authorization callback URL>に入力した任意のURL

ふじしろふじしろ

処理の理解

 /**
     * 認証後にユーザー情報を取得するアクション
     * @param mav
     * @return
     */
    @GetMapping("/profile")
    public ModelAndView profile(ModelAndView mav) {
        // セッションからアクセストークンを取得
        Object userInfo = httpSession.getAttribute(TOKEN);
        if (userInfo != null){
            mav.setViewName("profile");
            // GitHubクラスにGitHubTempleteインスタンスを生成
            // ->GitHubTempleteインスタンスはセッションから取り出したToken情報から生成できるっぽい
            GitHub gitHub = new GitHubTemplate(userInfo.toString());

            String userName = gitHub.userOperations().getUserProfile().getUsername();
            Long userId = gitHub.userOperations().getUserProfile().getId();
            mav.addObject("userName",userName);
            mav.addObject("userId",userId);
        }else{
            mav.setViewName("error/401");
        }
        return mav;
    }
ふじしろふじしろ

GitHub gitHub = new GitHubTemplate(userInfo.toString());で生成されたGitHubインスタンスの中身を見てみる

// トークン取得
Object token = httpSession.getAttribute(TOKEN);
// トークンからGitHubインスタンス生成
GitHub gitHub = new GitHubTemplate(token.toString());
// GitHubインスタンスの中身を出力
System.out.println(ToStringBuilder.reflectionToString(gitHub, ToStringStyle.MULTI_LINE_STYLE));

参考:Javaでオブジェクトの中身を表示する方法 – さいけの技術ブログ
以下printlnの結果

org.springframework.social.github.api.impl.GitHubTemplate@****[
  gistOperations=org.springframework.social.github.api.impl.GistTemplate@****
  repoOperations=org.springframework.social.github.api.impl.RepoTemplate@****
  userOperations=org.springframework.social.github.api.impl.UserTemplate@****
  accessToken=gho_****
  restTemplate=org.springframework.web.client.RestTemplate@****
]

->GitHubテンプレートの中にさらに3つのテンプレートが格納されている。

  1. GistTemplete
  2. RepoTemplete
  3. UserTemplete
ふじしろふじしろ

全体的な作業の流れ

  1. アプリケーションを作成。ざっくり以下の処理を用意しておくとイメージしやすい。
    1. top画面表示処理(ログイン前の画面)
    2. login処理(GItHubの認証画面へ遷移)
    3. callback処理(GitHubの認証画面から遷移)
    4. main画面表示処理(ログイン後の画面)
  2. OAuthアプリの作成 - GitHub Docsに従い、OAuthアプリを登録。
  3. 登録後の画面で、Client IDCrient Secretをそれぞれメモ
  4. login処理でClient IDを活用して認証画面へ
  5. callback処理でCliend IDClient Secretcodeを活用してアクセストークンを取得
  6. 取得したアクセストークンから認証情報を取得してログイン後に活用する