ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

登录等第三方认证-outh2原理与分析

2021-11-23 13:00:22  阅读:173  来源: 互联网

标签:网易 code 登录 微信 用户 认证 访问 outh2 授权


看了很多关于outh2应用文章,介绍都比较晦涩难懂,同时没有一个实际案例说明,
下面,我将使用security+outh2简单案例讲解,并通过微信认证流程解释为什么这种实现方式是最佳的。

1. Security实现Outh2登录

1.1 项目环境搭建及说明
  • 搭建springboot项目引入依赖
 		<!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
  • 我的站点资源

默认情况下,访问会被security登录拦截,输入配置信息,即可访问到接口资源

@RestController
@RequestMapping("/api")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

用户信息配置:

security.user.name=lonk
security.user.password=lonk
  • 限制资源访问

要实现outh2方式登录后才能访问资源的话,就要对资源访问做限制,我们配置一个资源服务器

@Configuration 
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {


    /***
     *  配置访问权限
     *
     * @param http
     * @throws Exception
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**"); 
                // 对 "/api/**" 开启认证
    }

}

配置后,访问接口就会被拦截

  • 授权服务器

授权服务器类似第三方认证,提供一个授权信息; 此时项目整体环境搭建好了,下面讲解具体认证流程。

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("client_app_id")
                .secret("pwd123456") 
                .redirectUris("http://localhost:8080/callback")
                .authorizedGrantTypes("authorization_code") // 授权码模式
                .scopes("read_userinfo") // 可授权的 Scope
                ;
    }

}
1.2 验证码方式认证流程
  • 获取授权码

1.浏览器访问:http://localhost:8080/oauth/authorize?
client_id=client_app_id&
redirect_uri=http://localhost:8080/callback&
response_type=code&
scope=read_userinfo
2.被拦截输入security配置用户名密码
3.验证成功,会重定向到:http://localhost:8080/callback?code=sSGEXP, code值即为授权码。

  • 获取访问token
{
    "access_token": "30bf2637-4e41-4891-a0c0-ffeb8b50ed7a",
    "token_type": "bearer",
    "expires_in": 43199,
    "scope": "read_userinfo"
}

在这里插入图片描述

在这里插入图片描述

  • 使用token访问限制接口
    在这里插入图片描述

2. 认证流程分析

我以微信账号登录网易音乐为例,按如下步骤说明:

2.1 网易在微信上注册信息

如果网易平台想获取微信用户的信息,微信会要求先在它的平台上注册一个应用,在申请的时候标明需要获取用户信息的哪些权限,并且在申请的时候填写你的网站域名,微信只允许在这个域名中获取用户信息。

审核通过后,会得到:

  • Client Id
  • Client Secret

微信-网站应用开发
在这里插入图片描述

2.2 用户和微信间协商

用户进入网易时,点击微信登录按钮,网易会将微信发放的Client Id交给用户,
让他进入微信授权界面:

如果用户同意,在授权页面点击了确认授权后,页面会跳转到网易预先设定的
redirect_uri并附带一个授权码code

2.3 网易访问微信

网易已经拿到授权码code,但这个code 只能表明,用户允许网易从微信上获取该用户的数据,如果其他平台拿这个code去微信访问用户数据一定会被拒绝,因为任何平台都可以持有code,微信并不知道code持有方就是谁。

此时, 网易使用用户授权的code和网易的client_id、client_secret去访问微信,拿到最后的access_token。

2.4 用户开始微信账号在网易上听音乐

网易有了access_token,通过微信提供的 API就能够访问用户的信息了,能获取用户的哪些权限通过scope做限制。

在这里插入图片描述

参考:https://blog.csdn.net/qq_40437152/article/details/84303104

标签:网易,code,登录,微信,用户,认证,访问,outh2,授权
来源: https://blog.csdn.net/linkingfei/article/details/121483022

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有