autorización OAuth de los principios a registro de combate

breve

OAuth(Nombre completo: Open Authorization) es el más popular del mecanismo de autorización para autorizar las aplicaciones de terceros, el acceso a los datos del usuario. Anteriormente iniciar sesión en cualquier sitio web deben estar registrados, y dejar que el relleno usuario la información tediosa muy impotente, pueden ahora OAuthacuerdos de licencia que iniciar sesión aplicaciones de terceros, lo que elimina el proceso de registro, mejorar la retención de usuarios en cierta medida.

análisis proceso de autorización OAuth

Autorizar el código de autorización generalmente se divide en cuatro pasos:

  1. aplicación de terceros guía al servidor de autorización de acceso de los usuarios, intentar obtener la autorización del usuario, el usuario selecciona si ha de autorizar
  2. Después de obtener el servidor de autorización a los usuarios autenticarse en el servidor de aplicaciones devuelve un código de autorización
  3. Después de que el servidor de aplicaciones a petición de código de autorización de transporte modo, el servidor de autorización para el código de autorización y clave secreta de cliente para una autenticación exitosa los problemas del servidor de autorización token de
  4. El servidor de aplicación solicita al usuario lleva la información de contadores al servidor de autorización, el servidor de autorización devuelve la información requerida testigo de autenticación

Aquí es un simple diagrama de temporización dibujé:

Mientras un usuario puede ver la sesión para completar la autorización, y los códigos de autorización, fichas para el servidor de aplicaciones de manejar, muy conveniente!

¿Por qué debería devolver el servidor de autorización codeen lugar de un retorno directo access_token, este paso es que el modo redundante?
En primer lugar, no es operaciones redundantes, y su petición de esta manera hay una relación, a fin de garantizar la seguridad, detrás de la relación real es visible.

  • usuarios directos a Link es un hipervínculo, que era una getsolicitud para obtener la autorización del usuario, a través de un hipervínculo en el servidor de autorización redirect_uriatrás, se puede ver en la barra de direcciones del navegador, si el retorno directo access_tokeny, a continuación, es muy insegura.
  • Por lo tanto, OAuthla introducción de un código de autorización, código de autorización visible no es importante, porque una vez más se echa (mayor nivel de paridad, no sólo para solicitar el código de autorización también se aplican algunos de su propia información de identidad) con al solicitar un token, pero esta autorización respuesta del servidor no pasó por el navegador directamente en el back-end, por lo que a pesar de más de una solicitud, sino garantizar el token de seguridad.

OAuth combate autorización

EDITORIAL mi trasero hacia arriba QQ, GitHubde microblogueo registra, es básicamente el mismo, pero difieren en un número de parámetros de la API, por lo que necesita a los documentos de consulta, tales como QQsolicitar información del usuario para el usuario OpenID, a microblogging uidy así sucesivamente. GitHubEs la más simple posible localhostde prueba local, como microblogging, QQnecesidad IPy el nombre de dominio, y no es compatible con micro-canales aparentemente desarrollo personal.

El siguiente orden GitHub, por ejemplo, para iniciar los aspectos de combate:

  1. Ir a GitHubla información de la solicitud de registro, el acceso client id, y client secret
    cómo crear
  2. La colocación de enlaces para guiar el usuario hace clic en la
    documentación detallada (este documento a través de los parámetros del proceso de autorización, han solicitado métodos)
    <a id="github" class="github" href="https://github.com/login/oauth/authorize?client_id=xx&redirect_uri=http://127.0.0.1:8085/githubcallback&scope=user&state=1">
        <i class="fa fa-github"></i>
    </a>
    复制代码
  3. Antecedentes recibir el código de autorización code, y llevando codetoken de solicitud
    // 封装申请令牌的参数
    @Data
    public class GitHubAccessTokenDTO {
        // 注册时收到的客户端ID
        private String client_id;
        // 注册时收到的客户密码
        private String client_secret;
        // 授权码
        private String code;
        // 重定向uri   授权后让用户跳转到哪里
        private String redirect_uri;
        // 自己提供的随机字符串   防止跨站攻击
        private String state;
    }
    
    // 发送Post请求,申请令牌(使用的是okhttp3)
    public String getAccessToken(GitHubAccessTokenDTO accessTokenDTO) {
        MediaType mediaType = MediaType.get("application/json; charset=utf-8");
        OkHttpClient client = new OkHttpClient();
    
        RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accessTokenDTO));
        Request request = new Request.Builder()
                .url("https://github.com/login/oauth/access_token")
                .post(body)
                .build();
        try (Response response = client.newCall(request).execute()) {
            String str = response.body().string();
            // 截取有用的部分
            String token = str.split("&")[0].split("=")[1];
            return token;
        } catch (IOException e) {
            log.error("get GitHub access_token error, {}", e);
        }
        return null;
    }
    
    // Controller接收code,state,请求令牌
    @GetMapping("/githubcallback")
    public String github_callback(@RequestParam(name = "code") String code,
                                  @RequestParam(name = "state") String state) {
        GitHubAccessTokenDTO accessTokenDTO = new GitHubAccessTokenDTO();
        accessTokenDTO.setClient_id(github_clientId);
        accessTokenDTO.setClient_secret(github_secret);
        accessTokenDTO.setState(state);
        accessTokenDTO.setCode(code);
        accessTokenDTO.setRedirect_uri(github_redirectUri);
        String accessToken = gitHubProvider.getAccessToken(accessTokenDTO);     
    }
    复制代码
  4. El token de access_tokensolicitud de información de usuario
    public GitHubUser getUser(String accessToken) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://api.github.com/user")
                .header("Authorization", "token " + accessToken)
                .build();
    
        try {
            Response response = client.newCall(request).execute();
            String str = response.body().string();// json格式,需转换(使用的是FastJSON)
            GitHubUser gitHubUser = JSON.parseObject(str, GitHubUser.class);
            return gitHubUser;
        } catch (IOException e) {
            log.error("get GitHub User error, {}", e);
        }
        return null;
    }
    
    // 在github_callback()接着请求
    GitHubUser gitHubUser = gitHubProvider.getUser(accessToken);
    复制代码
  5. Para obtener la información del usuario puede persistir durante cayendo
    // 在github_callback()中处理
    if (gitHubUser != null) {// 登录成功
        // 数据库user拿想要的信息(也可以登录态持久化,添加Cookie等一系列操作。。。)
        // userService.insert(user);。。。
        
        // 登录成功,回到首页
        return "redirect:/";
    }
    复制代码

resumen

En otro proceso de acoplamiento de servicio autorizado, la necesidad de consultar los documentos pertinentes, algunos documentos que describen claro, también hay que manualmente Debugir prueba o ejercicio mismo de la capacidad de una persona, por supuesto, después de la terminación de toda la culata o un cierto sentido de logro!
Eso es más que un poco de mi opinión personal, si hay un error, por favor me corrija! ! !

Supongo que te gusta

Origin juejin.im/post/5e731cf2f265da571e263bed
Recomendado
Clasificación