• 基于Http Basic Authentication的接口


    Basic Authenrication是 HTTP 用户代理提供用户名的一种方法 ,它是对 Web 资源实施访问控制的最简单技术,它不需要 Cookie、会话标识符和登录页面。HTTP Basic身份验证使用静态的标准HTTP标头,这意味着 不必在预期中进行握手。

    用户代理想要发送服务器身份验证凭据时,它可能使用授权标头。授权标头构造规则如下:

    • 用户名和密码组合成一个字符串“用户名:密码”
    • 使用Base64编码对生成的字符串进行编码
    • 将授权方法和空格(即“基本”)放在编码字符串之前。

    例如,如果用户代理使用“阿拉丁”作为用户名,使用“芝麻开门”作为密码,则标头的形成如下:

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    下面,我们编写一个接口,和请求该接口的客户端代码

    接口:

    1. package com.java2novice.restful;
    2. import java.io.IOException;
    3. import javax.ws.rs.GET;
    4. import javax.ws.rs.HeaderParam;
    5. import javax.ws.rs.Path;
    6. import javax.ws.rs.PathParam;
    7. import javax.ws.rs.Produces;
    8. import javax.ws.rs.core.MediaType;
    9. import sun.misc.BASE64Decoder;
    10. import com.java2novice.model.Order;
    11. @Path("/order-inventory")
    12. public class OrderInventoryService {
    13. @GET
    14. @Path("/order/{orderId}")
    15. @Produces(MediaType.APPLICATION_JSON)
    16. public Object getUserById(@PathParam("orderId") Integer orderId,
    17. @HeaderParam("authorization") String authString){
    18. if(!isUserAuthenticated(authString)){
    19. return "{\"error\":\"User not authenticated\"}";
    20. }
    21. Order ord = new Order();
    22. ord.setCustmer("Java2Novice");
    23. ord.setAddress("Bangalore");
    24. ord.setAmount("$2000");
    25. return ord;
    26. }
    27. private boolean isUserAuthenticated(String authString){
    28. String decodedAuth = "";
    29. // 标头格式为“Basic 5tyc0uiDat4”
    30. // 我们需要在将数据解码回原始字符串之前提取数据
    31. String[] authParts = authString.split("\\s+");
    32. String authInfo = authParts[1];
    33. // 将数据解码回原始字符串
    34. byte[] bytes = null;
    35. try {
    36. bytes = new BASE64Decoder().decodeBuffer(authInfo);
    37. } catch (IOException e) {
    38. // TODO 自动生成的 catch 块
    39. e.printStackTrace();
    40. }
    41. decodedAuth = new String(bytes);
    42. System.out.println(decodedAuth);
    43. /**
    44. * 此处包含验证用户身份验证的逻辑。
    45. * 它可以使用 ldap,或令牌交换机制或您的
    46. * 自定义身份验证机制。
    47. */
    48. // 你的验证码放在这里......
    49. return true;
    50. }
    51. }

    客户端代码:

    1. package com.java2novice.rest.client;
    2. import sun.misc.BASE64Encoder;
    3. import com.sun.jersey.api.client.Client;
    4. import com.sun.jersey.api.client.ClientResponse;
    5. import com.sun.jersey.api.client.WebResource;
    6. public class JersyGetClient {
    7. public static void main(String a[]){
    8. String url = "http://localhost:8080/RestfulWebServices/order-inventory/order/1016";
    9. String name = "java2novice";
    10. String password = "Simple4u!";
    11. String authString = name + ":" + password;
    12. String authStringEnc = new BASE64Encoder().encode(authString.getBytes());
    13. System.out.println("Base64 encoded auth string: " + authStringEnc);
    14. Client restClient = Client.create();
    15. WebResource webResource = restClient.resource(url);
    16. ClientResponse resp = webResource.accept("application/json")
    17. .header("Authorization", "Basic " + authStringEnc)
    18. .get(ClientResponse.class);
    19. if(resp.getStatus() != 200){
    20. System.err.println("Unable to connect to the server");
    21. }
    22. String output = resp.getEntity(String.class);
    23. System.out.println("response: "+output);
    24. }
    25. }

    除了Http Basic Authentication认证方法外,还有其他几种认证方式,详细请参考:

    细说API – 认证、授权和凭证 - 知乎 (zhihu.com)

    链接:具有 HTTP 基本身份验证的 Restful Web 服务 - Java Restful Web Services (java2novice.com)

  • 相关阅读:
    html一个案例学会所有常用HTML(H5)标签
    【超分】A Benchmark for Chinese-English Scene Text Image Super-resolution
    STLINK-V3 STDC14座转2.54mm排针转接板Kicad工程
    代码随想录打卡第二十一天
    基于SSM 实现增删查改
    情侣飞行棋情侣游戏源码
    关于 KL 散度和变分推断的 ELBO
    Gloss优化
    【雷达通信】阵列信号处理(Matlab代码实现)
    Flutter开发实战之Google Play 最佳应用程序开发者分享Flutter经验与技巧
  • 原文地址:https://blog.csdn.net/qq_41566366/article/details/133683920