当前位置: 首页 > 知识库问答 >
问题:

使用JWT和发送消息(XMPP)的MongooseIM身份验证

蒋原
2023-03-14

mongooseim规定使用JWT而不是用户名和密码进行授权。

在服务器端,文档建议修改mongooseim.toml文件(可在/etc/mongooseim/mongooseim.toml)

[auth]
  methods = ["jwt"]

  [auth.jwt]
    secret.value = "top-secret123"
    algorithm = "HS256"
    username_key = "user"

但如何从Gajim或Java代码进行身份验证呢?

共有1个答案

元彦君
2023-03-14

我们先来了解一下幕后发生了什么。

而不是传递用户名-密码对。我们创建一个JWT令牌并发送它。JWT令牌是无状态的,这意味着如果您拥有密钥,您可以将令牌解码并编码到原始消息。

这里有一个Java的工作代码。我们生成JWT令牌并发送该令牌而不是密码。为了生成JWT令牌,我们使用了Auth0(您将需要在classpath中添加它)。链接到maven项目。


import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import org.apache.axis2.java.security.TrustAllTrustManager;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.chat2.ChatManager;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;

import java.net.InetAddress;
import java.util.Date;

public class JWTMain {
    private final static String senderUsername = "jatin";
    private final static String senderPassword = "abcd";

    private final static String sendTo = "dad";

    public static void main(String[] args) {
        try {
            Algorithm algorithm = Algorithm.HMAC256("top-secret123");
            String token = JWT.create()
                    .withClaim("user",senderUsername) // they key needs to match with `username_key` in mongooseim.toml file
                    .withClaim(senderUsername, senderPassword)
                    .sign(algorithm);

            System.out.println("Token generated: " + token);

            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.required)
                    .setUsernameAndPassword(senderUsername, token)
                    .setXmppDomain(JidCreate.domainBareFrom("localhost"))
                    .setHostAddress(InetAddress.getByName("localhost"))
                    .setPort(5222)
                    .setCustomX509TrustManager(new TrustAllTrustManager())
                    .addEnabledSaslMechanism("PLAIN")
                    .build();

            AbstractXMPPConnection connection = new XMPPTCPConnection(config);
            AbstractXMPPConnection connect = connection.connect();
            connection.login();
            sendMessage("This message is being sent programmatically? " + new Date(), sendTo + "@localhost", connect);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static void sendMessage(String body, String toJid, AbstractXMPPConnection mConnection) throws Exception {
        Jid jid = JidCreate.from(toJid);
        Chat chat = ChatManager.getInstanceFor(mConnection)
                .chatWith(jid.asEntityBareJidIfPossible());
        chat.send(body);
        System.out.println("Message sent to : " + toJid);
    }
}

如果希望使用JWT令牌登录到Gajim:

上面的程序输出JWT令牌。您可以使用该令牌并在密码字段中提供该令牌。

 类似资料:
  • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl

  • 但请求呢?和是用户的属性,但应将它们发送到endpoint。如果我将资源发送到endpoint,则没有多大意义。 对此有没有办法,遵循JSONAPI并保持API的意义?

  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 我正在开发一个简单的API来处理Firebase所做的认证——稍后用于Android客户端。 因此,在Firebase控制台中,我启用了Facebook和Google登录方法并创建了一个示例html页面,我可以使用它来测试登录方法-下一个函数由按钮调用: 接下来,我使用令牌,并通过jQuery的一个简单ajax调用将它发送到我的API: 下一站:API后端。网芯。 在启动下,我配置了 JwtBea

  • 在身份验证等情况下,与会话相比,使用JWTs有什么优势? 它是作为独立方法使用还是在会话中使用?