OAuth2.0认证中心的使用

本文介绍OAuth2.0开放标准及其在微博社交登录中的应用,详细讲解了如何在微博开放平台上申请认证权限,并实现用户授权流程,包括获取AccessToken及与远程服务交互完成社交登录或注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【笔记于学习尚硅谷课程所作】

1、OAuth2.0简介

​ OAuth (开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

在这里插入图片描述

2、去微博申请认证权限

1.去微博的开放平台,登录并进入微连接–>网站接入–>立即接入

在这里插入图片描述

2.创建新应用(没完善信息的先完善信息)

在这里插入图片描述

3.完善回调页信息

在这里插入图片描述

4.接下来使用的步骤

  • 引导需要授权的用户到如下地址
  • 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE
  • 换取Access Token

5.查看应用信息

在这里插入图片描述

3、使用社交登录

1.引导需要授权的用户到如下地址

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

//YOUR_CLIENT_ID -->App Key
//YOUR_REGISTERED_REDIRECT_URI-->回调页成功的地址

2.在跳转地址中,放入授权地址

<a href="https://api.weibo.com/oauth2/authorize?client_id=3317019994&response_type=code&redirect_uri=http://gulimall.com/oauth2.0/weibo/success">
<img style="width: 50px; height: 18px" src="/static/login/JD_img/weibo.png" />
</a>

3.编写controller,获取Access Token

@Slf4j
@Controller
public class OAuth2Controller {

    @Autowired
    private MemberFeignService memberFeignService;

    /**
     * 根据code换取accessToken - 调用远程gulimall-member服务进行社交登录或注册
     * @param code
     * @return
     * @throws Exception
     */
    @GetMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code") String code, HttpSession session, HttpServletResponse servletResponse) throws Exception {

        // 根据code换取accessToken
        Map<String, String> map = new HashMap<>();
        map.put("client_id", "3317019994");//App Key
        map.put("client_secret", "f39dddba437c5801944bfd7eb74815f1");//App Secret
        map.put("grant_type", "authorization_code");
        map.put("redirect_uri", "http://auth.gulimall.com/oauth2.0/weibo/success");//授权页回调地址
        map.put("code", code);
        HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<String, String>(), null, map);

        // 2、处理响应数据
        if (response.getStatusLine().getStatusCode() == 200) {
            // 获取到了accessToken
            String json = EntityUtils.toString(response.getEntity()); // 将响应的内容转换成json字符串
            SocialUserVo socialUserVo = JSON.parseObject(json, SocialUserVo.class); // 将获取到的json转换成SocialUserVo对象

            // 1、会员第一次登陆,自动注册(为当前社交用户生成一个会员信息账号,以后这个社交账号就对应指定的会员信息)
            // 调用远程服务 gulimall-member 登陆或注册操作
            R r = memberFeignService.oauthLogin(socialUserVo);
            if (r.getCode() == 0) {
                MemberRespVo memberRespVo = r.getData("data", new TypeReference<MemberRespVo>() {
                });
                log.info("微博用户登录成功,用户信息:{}", memberRespVo);
                session.setAttribute(AuthServerConstant.LOGIN_USER, memberRespVo);

                return "redirect:http://gulimall.com";
            } else {
                return "redirect:http://auth.gulimall.com/login.html";
            }

        } else { // 远程请求社交服务获取数据失败
            return "redirect:http://auth.gulimall.com/login.html";
        }
    }
}
# MCloud - OAuth2 认证中心 [![Build Status](https://www.travis-ci.org/heyuxian/mcloud-oauth2-server.svg?branch=master)](https://www.travis-ci.org/heyuxian/mcloud-oauth2-server) [![Coverage Status](https://coveralls.io/repos/github/heyuxian/mcloud-oauth2-server/badge.svg?branch=master)](https://coveralls.io/github/heyuxian/mcloud-oauth2-server?branch=master) [![License](https://img.shields.io/badge/License-Apache 2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) ## 简介 `mcloud-oauth-server` 基于**Spring OAuth2**,实现了**OAuth2**认证服务器以及资源服务器,并以 **Restful API** 的方式提供了**OAuth** 客户端以及用户的管理功能。 项目中主要使用了以下技术: - **Java8** - **Spring 相关** Spring, Spring Mvc, Spring Cloud, Spring data jpa, Spring Boot,Hibernate - **mapstruct** 主要用于DTO 与 Entity 之间的转换 - **flywaydb** 以版本化的方式管理数据库脚本 - **thymeleaf** 模板框架,用于实现后台管理界面 - **Redis** 主要用作缓存实现 (暂未实现) - **lombok** ## 认证流程 **OAuth2**认证流程可参考博客 [理解OAuth 2.0](http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html) ,此处不再赘述。 ## Features - **认证服务器** 使用Spring Security 结合 JWT Token 实现认证服务,提供了功能完整的 OAuth2 认证服务器。 - **资源服务器** 实现了以下两种方式进行OAuth2 相关资源的管理 - 以 RestAPI 形式提供服务来管理资源:`http://localhost:8043/uaa/swagger-ui.html` - 以 Thymeleaf + [AdminBSBMaterialDesign](https://github.com/gurayyarar/AdminBSBMaterialDesign) 实现的管理端: ​ **用户端** ![image](https://user-images.githubusercontent.com/30259465/33719089-a021befc-db9a-11e7-9a59-179f531dcfe4.png) **管理员** ![image](https://user-images.githubusercontent.com/30259465/33719145-c7c0af54-db9a-11e7-8c52-f92df2cdd7a1.png) ## 快速使用 **创建数据库** 请使用 mysql 客户端或是其他你喜欢的工具创建数据库,默认的数据库名称为 `db_oauth` **使用flywaydb初始化数据库** 修改 `pom.xml`中 **flywaydb** 插件的数据库名,用户名以及密码: **pom.xml** ```xml <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>4.2.0</version> <configuration> <user>root</user> <password>你的数据库密码</password> <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://localhost:3306/数据库名称</url> </configuration> </plugin> ``` 修改相关配置之后,请在项目根目录下执行maven命令: ``` mvn flyway:clean flyway:migrate ``` 修改项目的数据库配置: **application.yml** ```yaml spring: datasource: url: jdbc:mysql://localhost/数据库名称 username: 用户 password: 密码 driver-class-name: com.mysql.jdbc.Driver ``` **启动OAuth2认证服务** 所有准备工作已经完成,现在,让我们启动服务,在项目根目录下运行maven命令: ``` mvn clean install mvn spring-boot:run ``` 如果你使用的是 Idea 或 eclipse 开发,请直接运行 **OAuthServerApplication** 这个方法即可启动服务。 **访问地址** ``` http://localhost:8043/uaa/swagger-ui.html ``` ![uaa](https://user-images.githubusercontent.com/30259465/31441550-16f2053e-aec6-11e7-9568-93cd35dbc1dd.png) ## 使用 Postman 调试API **前提:** 了解Postman并且安装了 **Chrome** 的 **Postman** 插件 首先自然是启动服务,然后我们在Postman中请求 `http://localhost:8043/uaa/api/v1/users/` ,此时因为还未进行认证,所以服务器返回的是 `401` 的状态码: ![OAuth fail](https://user-images.githubusercontent.com/30259465/31854106-e2270cf6-b6c6-11e7-91e3-f66ec6fef9fd.png) 现在我们通过Postman 自带的OAuth认证功能进行认证: ![qq 20171022011928](https://user-images.githubusercontent.com/30259465/31854237-11da1e38-b6c8-11e7-90b0-40dc54325b67.png) ![qq 20171022012054](https://user-images.githubusercontent.com/30259465/31854178-c1ad282e-b6c7-11e7-95a8-e2b5b006fcab.png) 相关项: - **Token Name** access_token - **Auth URL**: http://localhost:8043/uaa/oauth/authorize - **Access Token URL**: http://localhost:8043/uaa/oauth/token - **Client ID**: mcloud-blog - **Client Secret**: 123456 - **Scope**: 可以为空,此处不填 - **Grant Type**: Authorization code ![qq 20171126221612](https://user-images.githubusercontent.com/30259465/33240822-6c0d75ee-d2f7-11e7-810c-5dd523714c86.jpg) 默认用户: - **用户名** user - **密码** 123456 ![qq 20171022012701](https://user-images.githubusercontent.com/30259465/31854253-51b0a55e-b6c8-11e7-8415-d0ff4a242a85.png) 当我们授权之后,就可以得到 **access_token**,此时选中并点击 Use Token,然后我们再次访问之前无权限的 API ![qq 20171022013209](https://user-images.githubusercontent.com/30259465/31854294-d78b8fae-b6c8-11e7-8c77-46878e9159ef.png) 服务器已成功返回 `200` 的状态码,并返回了用户列表。 ## 其他 1. 因本项目使用了 **lombok** 进行开发,在开发之前需要安装插件,若使用的是 **IDEA** 进行开发,请自行搜索并安装 **lombok** 插件,否则会导致编译错误 2. 若是进行二次开发,请替换 `keystore.jks` **(非常重要)** ,否则会导致安全风险,`keystore.jks` 可使用jdk 工具生成,也可自行使用其他工具生成非对称密钥对。 ## 问题及建议 如果你有任何好的意见以及建议,请提 [Issue](https://github.com/heyuxian/mcloud-oauth2-server/issues/new)。 如果你觉得此项目对你有所帮助,欢迎点赞支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值