diff --git a/services/identity/src/grpc_services/authenticated.rs b/services/identity/src/grpc_services/authenticated.rs
--- a/services/identity/src/grpc_services/authenticated.rs
+++ b/services/identity/src/grpc_services/authenticated.rs
@@ -403,6 +403,27 @@
     let (user_id, _) = get_user_and_device_id(&request)?;
     let message = request.into_inner();
 
+    let mut get_farcaster_users_response = self
+      .db_client
+      .get_farcaster_users(vec![message.farcaster_id.clone()])
+      .await
+      .map_err(handle_db_error)?;
+
+    if get_farcaster_users_response.len() > 1 {
+      error!("multiple users associated with the same Farcaster ID");
+      return Err(Status::failed_precondition("cannot link Farcaster ID"));
+    }
+
+    if let Some(u) = get_farcaster_users_response.pop() {
+      if u.0.user_id == user_id {
+        return Ok(Response::new(Empty {}));
+      } else {
+        return Err(Status::already_exists(
+          "farcaster ID already associated with different user",
+        ));
+      }
+    }
+
     self
       .db_client
       .add_farcaster_id(user_id, message.farcaster_id)