(1) 注册应用
在Github注册一个应用,生成 client-id
, client-secret
。
注意这里的Home页: http://localhost:8080
,以及回调地址: http://localhost:8080/login/oauth2/code/github
(2) 配置 application.yml
spring:
security:
oauth2:
client:
registration:
github:
client-id:
client-secret:
(3) 启动应用
为了看到登录成功后的效果,这里增加一个 Controller
;然后运行应用。
@GetMapping(value = “/”)
public String index() {
log.info(SecurityContextHolder.getContext().getAuthentication().toString());
return "Welcome " + SecurityContextHolder.getContext().getAuthentication();
}
在浏览器键入: http://localhost:8080/login
,返回一个页面,其中包含了 Github
登录链接:
点击 Github
登录链接,会自动跳转至 Github
的认证页:
输入Github的账号、密码,会进入我们之前配置的Home页:
可通过链接退出: http://localhost:8080/logout
借助 SpringSecurity
对 OAuth2.0
的支持,我们几乎不用写什么代码就实现了 Github
登录集成。下面简单了解下登录成功后的 Registration
, AccessToken
。
实验1:查看Github在我们应用中的注册信息
为了方便调试或查看 registration
,这里新增一个接口端点:
@GetMapping(value = “/user/reg”)
public String registration() {
ClientRegistration githubRegistration = this.clientRegistrationRepository.findByRegistrationId(“github”);
log.info(githubRegistration.toString());
return githubRegistration.toString();
}
访问之后会返回 registration
信息,其中包含了 clientId
, clientSecret
, authorizationGrantType
, redirectUri
, scopes
等。
实验2:查看获取到的AccessToken
@GetMapping(value = “/user/token”)
public OAuth2AccessToken accessToken(OAuth2AuthenticationToken authentication) {
OAuth2AuthorizedClient authorizedClient = this.authorizedClientService.loadAuthorizedClient(
authentication.getAuthorizedClientRegistrationId(), authentication.getName());
OAuth2AccessToken accessToken = authorizedClient.getAccessToken();
return accessToken;
}
Note: 这里的 issuedAt
, expiresAt
着实诡异,仅差了一秒,是Github
授权服务问题?还没细看是什么原因。。
实验3:通过AccessToken请求Github的API
定义抽象 API
绑定类,通过拦截器将获取到的 AccessToken
设置到后续请求头中,通过 RestTemplate
实现对 API
的请求:
public abstract class ApiBinding {
protected RestTemplate restTemplate;
public ApiBinding(String accessToken) {
this.restTemplate = new RestTemplate();
if (accessToken != null) {
this.restTemplate.getInterceptors().add(getBearerTokenInterceptor(accessToken));
} else {
this.restTemplate.getInterceptors().add(getNoTokenInterceptor());
}
}
private ClientHttpRequestInterceptor getBearerTokenInterceptor(String accessToken) {
return new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().add(“Authorization”, "Bearer " + accessToken);
return execution.execute(request, bytes);
}
};
}
private ClientHttpRequestInterceptor getNoTokenInterceptor() {
return new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
throw new IllegalStateException(“Can’t access the Github API without an access token”);
}
};
}
}
将获取 AccessToken
的过程进行封装:
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
总结
在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。
1461292059)]
总结
在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。
[外链图片转存中…(img-dDuzD3Uz-1711461292059)]
[外链图片转存中…(img-6FqTmhyF-1711461292060)]
[外链图片转存中…(img-hwIwDcOL-1711461292060)]
[外链图片转存中…(img-lxfLjk7i-1711461292061)]文章来源:https://www.toymoban.com/news/detail-846005.html
本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录文章来源地址https://www.toymoban.com/news/detail-846005.html
到了这里,关于12-SpringSecurity:通过OAuth2集成Github登录,字节跳动网络工程师的面试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!