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 OAuth
acuerdos 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:
- 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
- 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
- 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
- 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 code
en 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
get
solicitud para obtener la autorización del usuario, a través de un hipervínculo en el servidor de autorizaciónredirect_uri
atrás, se puede ver en la barra de direcciones del navegador, si el retorno directoaccess_token
y, a continuación, es muy insegura. - Por lo tanto,
OAuth
la 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
GitHub
de 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 comoOpenID
, a microblogginguid
y así sucesivamente.GitHub
Es la más simple posiblelocalhost
de prueba local, como microblogging,IP
y 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:
- Ir a
GitHub
la información de la solicitud de registro, el accesoclient id
, yclient secret
cómo crear - 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> 复制代码
- Antecedentes recibir el código de autorización
code
, y llevandocode
token 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); } 复制代码
- El token de
access_token
solicitud de información de usuariopublic 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); 复制代码
- 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 Debug
ir 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! ! !