Open7
OAuthによる認証(GitHub連携)
活用するメソッドなど
-
GitHubConnectionFactory (Spring Social 1.0.0.M3 API)
- OAuth2ConnectionFactoryを拡張し、Github ConnectionFactory を生成するクラス
- GitHub用のOAuth用クラスを生成してくれてる感じか?
-
OAuth2Operations (Spring Social 1.1.4.RELEASE API)
- OAuthダンス(OAuth dance)を行うことができるインターフェース
- OAuthダンスとは、OAuthによる認証プロセスのこと(参考:OAuth 2.0 ダンスと OAuth 2.0 アクセストークン適用 | MuleSoft Documentation)
-
OAuth2Parameters (Spring Social 1.1.4.RELEASE API)
- OAuthパラメータを生成する。
-
GitHubTemplate (Spring Social 1.0.0.M3 API)
- アクセストークンを引数として、GitHubテンプレートを構築する。
- 挙動を見てみると、アクセストークンをもとにGitHubのユーザー情報を持つオブジェクトを生成してる感じ。
JVMシステムプロパティによりコマンドライン引数を使って機密情報を秘匿する
画面の流れ
- TOP画面
- (ログインボタン等クリック)
- OAuth認証画面
- (「認証」クリック or ログイン処理)
- ログイン後の画面
処理の流れ(URLは一例)
- TOP画面(
/
) - ログイン処理(
/login
) - GItHub認証画面(
https://github.com/login/oauth/authorize?client_id=<Client ID>
) - (認証)
- Callback処理画面(
/callback?code=<code>
)※ - アクセストークン取得処理(
https://github.com/login/oauth/access_token?code=<code>&client_id=<Client ID>&client_secret=<Client Secret>
) - アクセストークンから認証情報取得処理
- ログイン後の画面(
/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つのテンプレートが格納されている。
- GistTemplete
- RepoTemplete
- UserTemplete
全体的な作業の流れ
- アプリケーションを作成。ざっくり以下の処理を用意しておくとイメージしやすい。
- top画面表示処理(ログイン前の画面)
- login処理(GItHubの認証画面へ遷移)
- callback処理(GitHubの認証画面から遷移)
- main画面表示処理(ログイン後の画面)
- OAuthアプリの作成 - GitHub Docsに従い、OAuthアプリを登録。
- 登録後の画面で、
Client ID
とCrient Secret
をそれぞれメモ - login処理で
Client ID
を活用して認証画面へ - callback処理で
Cliend ID
、Client Secret
、code
を活用してアクセストークンを取得 - 取得したアクセストークンから認証情報を取得してログイン後に活用する